Один источник трудностей с этим вопросом является то , что у вас есть программа под названием bar/bar.py
: import bar
импорт либо bar/__init__.py
или bar/bar.py
, в зависимости от того, где это делается, что делает его немного громоздким , чтобы отслеживать , какие a
естьbar.a
.
Вот как это работает:
Ключ к пониманию того, что происходит, чтобы понять , что в вашем __init__.py
,
from bar import a
по сути делает что-то вроде
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
и определяет новую переменную ( bar/__init__.py:a
если хотите). Таким образом, ваш from bar import a
in __init__.py
связывает имя bar/__init__.py:a
с исходным bar.py:a
объектом ( None
). Именно поэтому вы можете сделать from bar import a as a2
в __init__.py
: в этом случае, очевидно , что у вас есть как bar/bar.py:a
и в отчетливую имя переменной bar/__init__.py:a2
(в вашем случае, имена двух переменных просто оказались оба a
, но они по- прежнему живут в разных пространствах имен: в __init__.py
, они есть bar.a
и a
).
Теперь, когда вы это сделаете
import bar
print bar.a
вы обращаетесь к переменной bar/__init__.py:a
(поскольку import bar
импортирует вашу bar/__init__.py
). Это переменная, которую вы изменяете (на 1). Вы не трогаете содержимое переменной bar/bar.py:a
. Итак, когда вы впоследствии сделаете
bar.foobar()
вы вызываете bar/bar.py:foobar()
, который обращается к переменной a
из bar/bar.py
, которая по-прежнему None
(когда foobar()
определена, она связывает имена переменных раз и навсегда, так что a
in bar.py
есть bar.py:a
, а не любая другая a
переменная, определенная в другом модуле, поскольку может быть много a
переменных во всех импортированных модулях ). Отсюда последний None
вывод.
Вывод: лучше избегать двусмысленности import bar
, не имея bar/bar.py
модуля (поскольку bar.__init__.py
каталог bar/
уже становится пакетом, с которым вы также можете импортировать import bar
).