Я получаю сообщение об ошибке 'redefined-outer-name'

При запуске моей строки я получаю следующую ошибку:

Redefining name 'tmp_file' from outer scope (line 38) (redefined-outer-name)

Вот мой фрагмент кода в этой строке:

tmp_file = open('../build/' + me_filename + '.js','w')

Ответ 1

Это происходит потому, что у вас есть локальное имя, идентичное глобальному имени. Локальное имя имеет приоритет, конечно, но оно скрывает глобальное имя, делает его неприемлемым и вызывает путаницу для читателя.

Решение

Измените локальное имя. Или, может быть, глобальное имя, что имеет смысл. Но учтите, что глобальное имя может быть частью интерфейса общего модуля. Локальное имя должно быть локальным и, следовательно, безопасным для изменения.

Если... ваше намерение состоит в том, чтобы эти имена были одинаковыми. Затем вам нужно будет объявить имя как global в локальной области:

tmp_file = None

def do_something():
    global tmp_file # <---- here!
    tmp_file = open(...)

Без объявления global локальный tmp_file не будет связан с глобальным. Отсюда предупреждение.

Ответ 2

Открыть с помощью with

Помимо @Rodrigo правильный ответ о областям: если ваш tmp_file - это просто временный файл, вы можете использовать

with open('../build/' + me_filename + '.js','w') as tmp_file:
    # do something

в обоих случаях. Он четко определяет, где будет использоваться ваш tmp_file.

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

Описание ошибки

Pylint имеет встроенное описание:

pylint --help-msg=redefined-outer-name

дает

: redefined-external-name (W0621): переопределение имени% r из внешней области (строка% s) Используется, когда имя переменной скрывает имя, определенное в внешний scope. Это сообщение принадлежит проверке переменных.

Ответ 3

Вы получаете эту ошибку, если вы определили одну и ту же переменную в нескольких местах, например, вне def и внутри def.

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