Python范围/命名空间问题

时间:2011-08-29 09:55:16

标签: python namespaces scope

我有两个python模块:

//// 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会产生一个名为“全局名称'D'未定义”的NameError。但是,如果我注释掉D()实例的创建,一切正常。

为什么会这样?

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

由于在模块初始化期间尝试使用循环导入的模块,会出现问题。为了澄清,使用“from module use *”需要编译模块。相反,如果你在两种情况下切换到使用“导入模块”,它应该可以正常工作。