2011-08-29 64 views
4

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

为什么会出现这种情况?

感谢

回答

2

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

+1

“要求编译模块”充其量是误导性的。模块代码被加载,编译和运行。但是'import mim''复制模块中的所有内容,'import m'给出模块对象的引用,因此可以看到后面的修改。 – delnan

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