【问题标题】:How does circular import work exactly in Python循环导入如何在 Python 中准确工作
【发布时间】:2014-06-26 02:53:12
【问题描述】:

我有以下代码(使用 CPython 3.4 运行):

基本上,红色箭头解释了我期望导入如何工作: h 在从 test2 导入之前定义。 因此,当 test2 导入 test1 时,它不再是一个空模块(使用 h) 而 h 是 test2 唯一想要的东西。

我认为这与http://effbot.org/zone/import-confusion.htm相矛盾

有什么提示吗?

【问题讨论】:

    标签: python import circular-dependency


    【解决方案1】:

    您缺少的是from X import Y 并不仅仅导入Y。它首先导入模块X。页面中提到了:

    from X import a, b, c 导入模块 X,并在当前命名空间中创建对给定对象的引用。或者换句话说,您现在可以在程序中使用 a 和 b 和 c。

    所以,这句话:

    from test import h
    

    在达到h的定义时不停止导入。

    让我们更改文件:

    test.py

    h = 3
    if __name__ != '__main__': #check if it's imported
        print('I'm still called!')
    ...
    

    当你运行test.py 时,你会在错误之前得到I'm still called!

    条件检查脚本是否被导入。在您编辑的代码中,如果您添加条件,您将print 仅当它充当主脚本时,而不是导入的脚本。

    这里有一些帮助:

    1. 测试导入 test2(已定义 h)
    2. test2 导入test,满足条件。
    3. 条件为假 - 已导入测试 - 因此,test2 不会寻找 test2.j - 它还不存在。

    希望这会有所帮助!

    【讨论】:

    • 好的,我做了更多测试。我将所有from ... import ... 更改为导入,并且在test.py 中:import test2 if __name__ == '__main__': print(test2.j) 这将起作用,但如果没有if 条件检查,它将引发AttributeError。有什么区别?
    • 就像文章说的那样。
    • 我已经编辑了我的答案。如果有帮助,请采纳! :D
    • 这绝对有帮助!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多