Una fonte di difficoltà con questa domanda è che si dispone di un programma di nome bar/bar.py
: import bar
le importazioni sia bar/__init__.py
o bar/bar.py
, a seconda di dove lo si fa, che lo rende un po 'ingombrante per tenere traccia che a
è bar.a
.
Ecco come funziona:
La chiave per capire ciò che accade è rendersi conto che nella tua __init__.py
,
from bar import a
in effetti fa qualcosa di simile
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
e definisce una nuova variabile ( bar/__init__.py:a
, se lo desideri). Quindi, il tuo from bar import a
in __init__.py
lega il nome all'oggetto bar/__init__.py:a
originale bar.py:a
( None
). Questo è il motivo per cui si può fare from bar import a as a2
in __init__.py
: in questo caso, è chiaro che avete sia bar/bar.py:a
ed una distinta nome di variabile bar/__init__.py:a2
(nel tuo caso, i nomi delle due variabili appena capita di essere entrambi a
, ma ancora vivo in spazi dei nomi diversi: in __init__.py
, sono bar.a
e a
).
Ora, quando lo fai
import bar
print bar.a
stai accedendo alla variabile bar/__init__.py:a
(poiché import bar
importa il tuo bar/__init__.py
). Questa è la variabile che modifichi (a 1). Non stai toccando il contenuto della variabile bar/bar.py:a
. Quindi quando lo fai successivamente
bar.foobar()
si chiama bar/bar.py:foobar()
, che accede alla variabile a
da bar/bar.py
, che è ancora None
(quando foobar()
è definita, lega i nomi delle variabili una volta per tutte, quindi a
in bar.py
è bar.py:a
, non qualsiasi altra a
variabile definita in un altro modulo, poiché potrebbero esserci molte a
variabili in tutti i moduli importati ). Da qui l'ultima None
uscita.
Conclusione: è meglio evitare qualsiasi ambiguità in import bar
, non avendo alcun bar/bar.py
modulo (poiché bar.__init__.py
rende bar/
già directory un pacchetto, che puoi anche importare con import bar
).