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