Забыв о самоопределении: как отловить эту ошибку? - PullRequest
1 голос
/ 07 августа 2010

Я понимаю, почему Python требует явного self квалификатора при обращении к атрибутам экземпляра.

Но я часто забываю это, поскольку он мне не нужен в C ++.

Ошибка Iвнедрить этот способ иногда чрезвычайно трудно уловить;например, предположим, что я пишу

if x is not None:
    f()

вместо

if self.x is not None:
    f()

Предположим, атрибут x обычно None, поэтому f() вызывается редко.И предположим, что f() создает только тонкий побочный эффект (например, изменение числового значения или очистка кэша и т. Д.).Если у меня нет безумного количества юнит-тестов, эта ошибка, вероятно, останется незамеченной в течение длительного времени.

Мне интересно, знает ли кто-нибудь методы кодирования или функции IDE, которые могли бы помочь мне поймать или избежать ошибок такого типа.

1 Ответ

5 голосов
/ 07 августа 2010

Не называйте ваш экземпляр атрибутов такими же вещами, как ваши глобальные / локальные.

Если глобальных / локальных имен с таким именем нет, вы получите ошибку global "foo" is not defined при попытке доступа к self.foo, но забудете self..

Как следствие: дайте своим переменным описательные имена. Не называйте все x - это не только снижает вероятность того, что у вас будут переменные с тем же именем, что и атрибуты, но и облегчает чтение вашего кода.

...