main.py:Python: ¿por qué un módulo importado no puede hacer referencia a otro módulo importado?
import subone
import subtwo
subone.py:
a = 'abc'
subtwo.py:
print subone.a
Correr python main.py
lanza una NameError: name 'subone' is not defined
. Esperaba que imprimiera 'abc'.
Refactorizando que utilice from
import
y las clases no ayuda:
main.py:
from subone import * # Only using from X import * for example purposes.
from subtwo import *
print 'from main.py:', a.out
subone.py:
class A:
out = 'def'
a = A()
SubTwo. py:
# This throws NameError: name 'a' is not defined
print a.out
# This throws NameError: name 'A' is not defined
b = A()
print b.out
PERO se imprimir 'desde main.py: def'. (Funciona al usar import
también.)
¿Por qué funciona de esta manera? Parece que una vez importado subone
, debe estar disponible para subtwo
.
¿Es porque es una mala programación que los módulos importados dependan unos de otros sin pasar por su módulo "principal"? ¿Hay alguna otra manera estándar de hacer esto?
Actualización:
ahora entiendo que el primer ejemplo no funcionará porque la línea print subone.a
no reconoce el nombre subone
, no estar en subtwo
's espacio de nombres (aunque sea en main.py
' s), y se está llamando desde el módulo subtwo
. Esto se puede solucionar usando import subone
en la parte superior de subtwo.py
- no volverá a cargar el módulo sino que lo agregará al espacio de nombre subtwo
para que subtwo
pueda usarlo.
Pero qué pasa con esto:
main.py:
from subone import Nugget
from subtwo import Wrap
wrap = Wrap()
print wrap.nugget.gold
subone.py:
class Nugget:
gold = 'def'
SubTwo.PY:
class Wrap:
nugget = Nugget()
yo creo que desde Wrap
y Nugget
son ambos cargaron directamente en main
'espacio de nombres s, que utilizarían main
' s espacio de nombres y ser capaz de hacer referencia entre sí, pero arroja una NameError: name 'Nugget' is not defined
. ¿ESTOY porque Wrap
se evalúa/comprueba desde dentro del espacio de nombresubtwo
ANTES de cargarse en el espacio de nombre main
?
Su encapsulación parece realmente roto ... – Daenyth
necesita buscar ámbito léxico. La idea básica es que el código tiene acceso a lo que puede 'ver' en el código fuente. lo que sucede en el tiempo de ejecución no tiene nada que ver con eso. – aaronasterling