Una fuente de dificultad con esta pregunta es que tiene un programa llamado bar/bar.py
: import bar
importa bar/__init__.py
o bar/bar.py
, dependiendo de dónde se haga, lo que hace que sea un poco engorroso rastrear cuál a
es bar.a
.
Así es como funciona:
La clave para comprender lo que sucede es darse cuenta de que en su __init__.py
,
from bar import a
en efecto hace algo como
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
y define una nueva variable ( bar/__init__.py:a
, si lo desea). Por lo tanto, su from bar import a
in __init__.py
vincula el nombre bar/__init__.py:a
al bar.py:a
objeto original ( None
). Esta es la razón por la que puede hacerlo from bar import a as a2
en __init__.py
: en este caso, está claro que tiene ambos bar/bar.py:a
y un nombre de variable distintobar/__init__.py:a2
(en su caso, los nombres de las dos variables resultan ser ambos a
, pero aún viven en espacios de nombres diferentes: en __init__.py
, son bar.a
y a
).
Ahora, cuando lo hagas
import bar
print bar.a
está accediendo a la variable bar/__init__.py:a
(ya que import bar
importa su bar/__init__.py
). Esta es la variable que modificas (a 1). No está tocando el contenido de la variable bar/bar.py:a
. Entonces, cuando lo hagas posteriormente
bar.foobar()
usted llama bar/bar.py:foobar()
, que accede a la variable a
desde bar/bar.py
, que sigue siendo None
(cuando foobar()
se define, enlaza los nombres de las variables de una vez por todas, por lo que el a
in bar.py
es bar.py:a
, no cualquier otra a
variable definida en otro módulo, ya que puede haber muchas a
variables en todos los módulos importados ). De ahí la última None
salida.
Conclusión: es mejor evitar cualquier ambigüedad import bar
al no tener ningún bar/bar.py
módulo (ya bar.__init__.py
que el directorio ya es bar/
un paquete, con el que también puedes importar import bar
).