Python作用域/命名空间问题

4

I have two python modules:

//// funcs.py

from classes import *

def func():
    d = D()
    print "func"

if __name__ == "__main__":
    c = C()

//// classes.py

from funcs import *

class C:
    def __init__(self):
        print "C class"
        func()

class D:
    def __init__(self):
        print "D class"

运行 funcs.py 时出现 NameError 错误,提示“全局名称 'D' 未定义”。但是,如果注释掉 D() 实例的创建,一切工作正常。为什么会这样?谢谢。
2个回答

5
这个版本可以在不增加代码复杂性的情况下正常工作:

///funcs.py

import classes

def func():
    d = classes.D()
    print "func"

if __name__ == "__main__":
    c = classes.C()

///classes.py

import funcs

class C:
    def __init__(self):
        print "C class"
        funcs.func()

class D:
    def __init__(self):
        print "D class"

有时候使用简单的导入语句要比使用from ... import ...更好。这里有一篇非常好的文章讲解这个问题:http://effbot.org/zone/import-confusion.htm

2
问题出现在模块初始化期间尝试使用循环导入的模块。为了澄清,使用"from module use *"需要编译模块。如果在两种情况下都切换到使用"import module",那么它应该可以正常工作。

1
“要求编译模块”最多是误导性的。无论如何,模块代码都将被加载、编译和运行。但是,“from m import *”会复制模块当前时刻的所有内容,“import m”则会给出对模块对象的引用,从而使后续修改可见。 - user395760

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接