NameError:未定义全局名称

时间:2011-08-15 16:47:36

标签: python

我知道有很多类似的问题,但他们没有帮助我理解我的问题。我还有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()

2 个答案:

答案 0 :(得分:6)

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

如果from foo import *导入了foo导入其自己范围的每个名称,则单个import something也可能导入os中的每个符号或例如sys。这将是一场噩梦。


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

感谢Ethan的纠正。

答案 1 :(得分:0)

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