Una fonte di difficoltà con questa domanda è che si dispone di un programma di nome bar/bar.py: import barle importazioni sia bar/__init__.pyo 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 ain __init__.pylega il nome all'oggetto bar/__init__.py:aoriginale bar.py:a( None). Questo è il motivo per cui si può fare from bar import a as a2in __init__.py: in questo caso, è chiaro che avete sia bar/bar.py:aed 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.ae a).
Ora, quando lo fai
import bar
print bar.a
stai accedendo alla variabile bar/__init__.py:a(poiché import barimporta 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 ada bar/bar.py, che è ancora None(quando foobar()è definita, lega i nomi delle variabili una volta per tutte, quindi ain bar.pyè bar.py:a, non qualsiasi altra avariabile definita in un altro modulo, poiché potrebbero esserci molte avariabili in tutti i moduli importati ). Da qui l'ultima Noneuscita.
Conclusione: è meglio evitare qualsiasi ambiguità in import bar, non avendo alcun bar/bar.pymodulo (poiché bar.__init__.pyrende bar/già directory un pacchetto, che puoi anche importare con import bar).