Путаница о глобальных переменных в 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, а не в пространстве имен, из которого вызывается функция. Ответ "Алебастр" дает хорошее решение.