【问题标题】:Python scope / namespace issuePython范围/命名空间问题
【发布时间】:2011-08-29 09:55:15
【问题描述】:

我有两个 python 模块:

//// funcs.py

from classes import *

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

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

//// 类.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() 实例的创建,一切正常。

为什么会这样?

谢谢

【问题讨论】:

    标签: python namespaces scope


    【解决方案1】:

    这个可以很好地工作,而不会使您的代码复杂化:

    ///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 *”需要编译模块。相反,如果您在这两种情况下都切换到使用“导入模块”,它应该可以正常工作。

      【讨论】:

      • “要求编译模块”充其量是误导。模块代码以任一方式加载、编译和运行。但是from m import * 复制了当时模块中的所有内容,而import m 提供了对模块对象的引用——因此使以后的修改可见。
      猜你喜欢
      • 2020-01-17
      • 2012-10-07
      • 2012-07-05
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多