繁体   English   中英

NameError:未定义全局名称

[英]NameError: global name is not defined

我知道有很多类似的问题,但它们并没有帮助我理解我的问题。 我也有3个模块:

第一个是model

from datetime import datetime
from elixir import *
from run_test import create_db
from sqlalchemy.schema import UniqueConstraint
class ValueTest(Test): 
    value = Field(Integer)
    def __init__(self, name, value):
        '''
        Constructor
        '''
        self.name = name;
        self.value = value

如果我从名为run_test的第二个模块运行测试方法,则没有任何问题

from model import *
def main():
    test();
def test():
    test = ValueTest("test",2)
if __name__ == "__main__":
    main()

但是当我尝试这样的事情时,我得到了众所周知的错误NameError: global name 'ValueTest' is not defined

import run_test
def main():
    run_test.test()
if __name__ == '__main__':
    main()

当你导入一个模块时,你不会导入它已经导入的名字; 您只导入它自己定义的名称。 您仍然需要在最后一个脚本中执行from model import ValueTest

如果from foo import *foo导入到其自己的 scope 中的每个名称导入,则单个import something也可能会导入ossys中的每个符号。 这将是一场噩梦。


事实上,这不是真的。 从模块导入的符号仅是由该模块中设置的__all__列表定义的符号。 (如果不存在,则确实导入了所有不以_开头的符号。)

感谢 Ethan 的更正。

问题是你有循环导入发生。 run_test正在导入model ,而后者又正在导入run_test 使用循环导入时会发生奇怪的事情。 如果可以,将常用函数(在您的示例中为create_db )放入另一个模块,然后model可以从那里导入它,而不是从run_test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM