Подтвердить что ты не робот

Предупреждение глобальной переменной в python

У меня есть python 2.6 script (да, я знаю, что мне нужно обновить не менее 2.7), который выглядит так:

ret_code = 0

def some_func()
  global ret_code
  ...

if __name__ == '__main__':
  global ret_code
  ...

Теперь я получаю предупреждение, если я запустил код: * Синтаксис Предупреждение: имя 'ret_code' назначается перед глобальным объявлением global ret_code *

Зачем мне это предупреждение?

Я могу решить проблему, сделав так:

def some_func()
      global ret_code
      ...

if __name__ == '__main__':
  global ret_code
  ret_code = 0 #assign 0 here instead of above
  ...

Тем не менее это не отвечает на мой вопрос. Что не так с исходным кодом?

4b9b3361

Ответ 1

Лучший прямой способ исправить это - удалить объявление global из-под if __name__ == '__main__':. Вам это не нужно. В отличие от некоторых других языков, оператор if не вводит новую область в Python - любые переменные, которые вы назначаете в этом блоке, являются глобальными, так же, как они были бы без if.

Это также объясняет, почему это ошибка: объявить переменную как global, вам не разрешено использовать это имя переменной ранее в той же области (предположительно, потому что это было бы путаницей для оператора global делать назначения перед тем, как перейти к глобальной переменной, а Python не поддерживает одно и то же имя, являющееся как глобальным, так и локальным в той же области). Поскольку if не вводит новую область, первое присваивание ret_code находится в той же области, что и глобальная декларация под if; но глобальная декларация приходит позже назначения, что не допускается.

Для еще лучшего исправления рассмотрите, можете ли вы полностью удалить изменчивое глобальное состояние из своей программы, поскольку оно обычно вызывает больше проблем, чем его ценность где-то позади. Здесь представляется вероятным, что вы используете ret_code в качестве кода выхода программы, т.е. Вы будете где-то делать sys.exit(ret_code), но вы решаете внутри функции, которая выдает код для использования. Вместо этого передайте достаточно информации обратно в код верхнего уровня, чтобы решить, какой код выхода использовать.