【发布时间】:2010-10-11 18:40:11
【问题描述】:
main.py:
import subone
import subtwo
subone.py:
a = 'abc'
subtwo.py:
print subone.a
运行python main.py 会抛出NameError: name 'subone' is not defined。我希望它打印“abc”。
重构它以使用 from import 和类没有帮助:
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
但是它会打印'from main.py: def'。 (使用import 也可以。)
为什么会这样?似乎一旦 subone 被导入,它应该对 subtwo 可用。
是不是因为不通过它们的“父”模块而让导入的模块相互依赖是不好的编程?还有其他标准方法吗?
更新:
我现在明白第一个示例不起作用,因为行 print subone.a 无法识别名称 subone,它不在 subtwo 的 命名空间中(即使它是在main.py's) 中,它是从模块subtwo 中调用的。这可以通过在subtwo.py 顶部使用import subone 来解决——它不会重新加载模块,但会将其添加到subtwo 的命名空间中,以便subtwo 可以使用它。
但是这个呢:
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()
我认为由于Wrap 和Nugget 都直接加载到main 的命名空间中,它们将使用main 的命名空间并能够相互引用,但它会抛出一个@ 987654350@。是因为Wrap 在被加载到main 的命名空间之前,是从subtwo 的命名空间内部 评估/检查的吗?
【问题讨论】:
-
你的封装好像真的坏了……
-
您需要查找词法范围。基本思想是代码可以访问它可以在源代码中“看到”的内容。运行时发生的事情与它无关。