Python: могу ли я установить глобальные переменные в модуле пакета __init__?

Итак, я читаю ответ Алекса Мартелли на другой вопрос...

«Один пример, в котором мне может понадобиться инициализация, — это когда во время загрузки пакета я хочу раз и навсегда прочитать кучу данных (скажем, из файлов, БД или Интернета) — в этом случае это намного приятнее. поместить это чтение в приватную функцию в init.py пакета вместо того, чтобы иметь отдельный «модуль инициализации» и избыточно импортировать этот модуль из каждого отдельного реального модуля в пакете...»

К сожалению, когда я пытаюсь это сделать:

foo/__init__.py

import tables as tb
global foo
foo = tb.openFile('foo.h5', etc._)
import bar

foo/bar/__init__.py

import tables as tb
global bar
bar = foo.createGroup('/', bar)
import MyFunction`

foo/bar/MyFunction.py

def MyFunction(*of foo and bar*):
   '...'

>>> import foo
>>> OUTPUT= foo.bar.MyFunction.MyFunction(INPUT)
>>> bar = foo.createGroup('/', bar)
NameError: name 'foo' is not defined

Как определить глобальные переменные, не помещая их в функцию (как показано здесь)?


person Noob Saibot    schedule 08.11.2012    source источник
comment
Все, что вам нужно сделать при вставке кода, — это сделать отступ в четыре пробела. Есть даже кнопка (с сочетанием клавиш), которая сделает это за вас.   -  person Marcelo Cantos    schedule 08.11.2012
comment
@Marcelo Cantos Я пытался, поверь мне. Я не знаю, что такое форматирование этой штуки, но, похоже, она никогда не хочет сотрудничать со мной.   -  person Noob Saibot    schedule 08.11.2012


Ответы (1)


глобальные переменные не являются глобальными в том смысле, что каждый бит кода Python видит один и тот же набор глобальных переменных. глобальность - это просто «область действия модуля»; Все переменные и функции, определенные в модуле, уже являются глобальными и настолько глобальными, насколько это возможно.

Если вы хотите увидеть переменные, определенные в одном модуле, среди глобальных переменных другого модуля, единственный способ сделать это — импортировать имена первого модуля во второй... IE:

# myModule.py
foo = "bar"
# yourModule.py
from myModule import foo
person SingleNegationElimination    schedule 08.11.2012
comment
Хорошая форма, @TokenMacGuy. Хорошая форма. - person Noob Saibot; 08.11.2012