python: избежать ошибки с использованием переменной перед присваиванием в цикле - PullRequest
2 голосов
/ 05 ноября 2010
for element in container:
  # some code here
  temp_variable = f1(element)
  # more code

# much later in the code

for element in container:
  # some code
  another_variable = g(temp_variable)
  # more code
  temp_variable = f2(element)
  # more code

Во втором цикле for я случайно использовал переменную temp_variable до ее назначения.Обычно я получаю исключение NameError, но здесь, к сожалению, оно сохранилось, действует и инициализируется из предыдущего цикла.

Существуют ли какие-либо методы кодирования, инструменты IDE и т. Д., Которые помогут предотвратить такие ошибки?

Кстати, я подумал, что было бы лучше, если бы переменные внутри цикла оставались не дожившими до конца цикла.

EDIT

@ Игнасио Васкес-Абрамс:

Если я правильно понял, вы предлагаете не использовать одно и то же имя переменной в качестве локальной переменной в нескольких циклах.У меня есть две проблемы с этим:

  1. Часто наиболее описательное имя переменной для использования бывает одинаковым в нескольких циклах.Скажем, я использовал что-то вроде unique_visitor_count.Я не хотел бы запретить использование этой переменной в дальнейшем в коде, в другом цикле.

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

Ответы [ 6 ]

7 голосов
/ 05 ноября 2010

Если в коде «намного позже», то вам, вероятно, следует разбить код на несколько функций. Похоже, функция слишком длинная.

Еще один совет - использовать значимые имена. temp_variable, tmp, temp и т. Д. Не являются хорошими именами. Используйте имя, которое описывает значение, на которое оно указывает. Это исключит большой класс потенциальных случаев этой проблемы.

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

4 голосов
/ 05 ноября 2010

Если вы хотите, чтобы переменные исчезали после окончания цикла, реорганизуйте цикл в функцию. Таким образом, после вызова функции переменные выйдут из области видимости и будут собирать мусор.

Что касается методов кодирования, которые бы предотвращали такие ошибки, я бы порекомендовал вам а.) Поместить в функции такие типы, которые требуют временных переменных, и б.) Модульный тест (поскольку второй цикл for не будет выполняться сам по себе модульный тест только для цикла for поймает вашу ошибку).

3 голосов
/ 05 ноября 2010

Другие предложили помещать код в функции, если вы не хотите, чтобы он пропускал локальные переменные.Я хотел бы предложить вам поместить эти функции внутри функции.Таким образом, они получают доступ к переменным, определенным во внешней функции, поэтому вам не нужно передавать их. Просто определите внутренние функции по мере необходимости и сразу же вызывайте их, если, конечно, они не могут быть повторно использованы.

def myfunc(a):

    i = 10

    def infunc():
        for i in range(a):
            print i,
    infunc()

    print i

myfunc(5)
>>> 0 1 2 3 4 10

Это не очень красиво, но работает, и вам не нужно это очень часто.

3 голосов
/ 05 ноября 2010

Попробуйте добавить del temp_variable, когда вы больше не хотите этого.

0 голосов
/ 05 ноября 2010

Существуют ли какие-либо методы кодирования, инструменты IDE и т. Д., Которые помогут предотвратить такие ошибки?

Сначала спроектируйте.Код второй.

0 голосов
/ 05 ноября 2010

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

...