Путаница о глобальных переменных в python
Я новичок в python, поэтому, пожалуйста, извините, что, вероятно, довольно глупый вопрос.
В принципе, у меня есть одна глобальная переменная, называемая _debug, которая используется для определения того, должен ли script выводить информацию об отладке. Моя проблема в том, что я не могу установить его в другом python script, чем тот, который его использует.
У меня есть два сценария:
one.py:
-------
def my_function():
if _debug:
print "debugging!"
two.py:
-------
from one import *
_debug = False
my_function()
Запуск two.py вызывает ошибку:
NameError: global name '_debug' is not defined
Может ли кто-нибудь сказать мне, что я делаю неправильно?
Ответы
Ответ 1
У меня больше проблем, чем просто ведущее подчеркивание, которое я боюсь.
Когда вы вызываете my_function()
, он все равно не будет иметь переменную debug
в своем пространстве имен, если вы не импортируете ее из two.py
.
Конечно, это означает, что вы получите циклические зависимости (one.py -> two.py -> one.py
), и вы получите NameError
, если вы не реорганизуете, где импортируются и объявляются различные вещи.
Одним из решений было бы создать простой третий модуль, который определяет "константы", подобные этому, которые можно безопасно импортировать из любого места, например:
constants.py
------------
debug = True
one.py
------
from constants import debug
#...
two.py
------
from constants import debug
#...
Однако я бы рекомендовал использовать только встроенный logging модуль - почему бы и нет? Он прост в настройке, проще в использовании, надежный, гибкий и расширяемый.
Ответ 2
Имена, начинающиеся с подчеркивания, не импортируются с помощью
from one import *
Ответ 3
Вы также можете использовать переменную __debug__
для отладки. Это правда, если интерпретатор не был запущен с опцией -O. Может также оказаться полезным утверждение assert.
Ответ 4
Немного больше объяснений: пространство имен my_function
всегда находится в модуле one
. Это означает, что, когда имя _debug
не найдено в my_function
, оно выглядит в one
, а не в пространстве имен, из которого вызывается функция. Ответ "Алебастр" дает хорошее решение.