Какие приемы вы используете, чтобы избежать путаницы с пробелами Python? - PullRequest
4 голосов
/ 15 августа 2010

Я опытный программист, но все еще немного зелен на Python.Я только что поймал ошибку в отступе, которая стоила мне значительного времени отладки.Мне было интересно, что делают опытные программисты на Python, чтобы избежать подобных проблем.

Вот код (часть гораздо более крупной программы):

class Wizvar():

    def select(self):
        self.selected = True

    def unselect(self):
        self.selected = False

        value = None

Проблема в том,значение = Нет 'должно быть перенесено на один уровень.Как таковая, переменная блокируется каждый раз, когда вызывается метод отмены выбора, а не только один раз.Я смотрел на это много раз, не видя, что было не так.

Ответы [ 3 ]

8 голосов
/ 15 августа 2010

Поместите все атрибуты класса (например, value) вверху, прямо под объявлением class Wizvar (ниже строки документа, но над всеми определениями методов). Если вы всегда размещаете атрибуты класса в одном и том же месте, вы не можете часто сталкиваться с этой конкретной ошибкой.

Обратите внимание, что если вы следуете вышеуказанному условию и написали:

class Wizvar():
        value = None

    def select(self):
        self.selected = True

    def unselect(self):
        self.selected = False

тогда Python вызовет IndentationError:

% test.py
  File "/home/unutbu/pybin/test.py", line 7
    def select(self):
                    ^
IndentationError: unindent does not match any outer indentation level
1 голос
/ 15 августа 2010

У меня нет таких проблем;) По крайней мере, они у меня встречаются реже, чем лишняя, отсутствующая или неуместная скобка или классика:

if (foo) 
    bar();
    baz();

на языке, который использует фигурные скобки.

Как говорится, определенные стили кодирования помогают. Например, я всегда перечисляю переменные класса в верхней части тела класса, поэтому, если я случайно укажу отступ, я получу IndentationError вместо создания неиспользуемой локальной переменной. Кстати, я всегда видел это так. Также помогает последовательный отступ (я использую PEP 8 и использую 4 пробела), некоторые люди используют только один пробел для некоторых блоков - это действительно легко пропустить.

Статический анализ кода (например, PyLint) может указывать на такие ошибки, но у меня нет большого опыта с ними. Как я уже писал, это работает в большинстве случаев.

1 голос
/ 15 августа 2010

В общем: много юнит-тестирования. Обзоры кода также очень помогают.

Эта конкретная ошибка кажется легко идентифицируемой, поскольку, если value должен был быть устаревшим, как если бы он был переменной класса, надлежащее модульное тестирование обнаружило бы, что это не так.

Такие инструменты, как PyDev отлично справляются с поиском других распространенных ошибок, поэтому вы можете захотеть их учесть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...