Uma fonte de dificuldade com essa questão é que você tem um programa chamado bar/bar.py
: import bar
importa bar/__init__.py
ou bar/bar.py
, dependendo de onde é feito, o que torna um pouco complicado rastrear qual a
é bar.a
.
É assim que funciona:
A chave para entender o que acontece é perceber que em seu __init__.py
,
from bar import a
na verdade, faz algo como
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
e define uma nova variável ( bar/__init__.py:a
se desejar). Assim, seu from bar import a
in __init__.py
associa o nome bar/__init__.py:a
ao bar.py:a
objeto original ( None
). É por isso que você pode fazer from bar import a as a2
em __init__.py
: neste caso, é claro que você tem ambos bar/bar.py:a
e um nome de variável distintobar/__init__.py:a2
(no seu caso, os nomes das duas variáveis são ambos a
, mas ainda vivem em namespaces diferentes: em __init__.py
, eles são bar.a
e a
).
Agora, quando você fizer
import bar
print bar.a
você está acessando a variável bar/__init__.py:a
(já que import bar
importa o seu bar/__init__.py
). Esta é a variável que você modifica (para 1). Você não está tocando o conteúdo da variável bar/bar.py:a
. Então, quando você posteriormente fizer
bar.foobar()
você chama bar/bar.py:foobar()
, que acessa a variável a
de bar/bar.py
, que ainda é None
(quando foobar()
é definida, vincula nomes de variáveis de uma vez por todas, então o a
in bar.py
é bar.py:a
, não qualquer outra a
variável definida em outro módulo - como pode haver muitas a
variáveis em todos os módulos importados ) Daí a última None
saída.
Conclusão: é melhor evitar qualquer ambigüidade no import bar
, por não ter nenhum bar/bar.py
módulo (já que bar.__init__.py
torna o diretório bar/
um pacote, com o qual você também pode importar import bar
).