page contents

修复 Python 循环导入的一种方法

在 Python 中,循环导入是指两个文件各自尝试导入另一个文件, 当模块未完全初始化时导致失败, 最好的修复方法 将代码分层组织,以便导入,但有时它可以只需更改使用的 import 语句的样式即可。

attachments-2026-03-nWzV7dLQ69c9d2f0bf906.png在 Python 中,循环导入是指两个文件各自尝试导入另一个文件, 当模块未完全初始化时导致失败, 最好的修复方法 将代码分层组织,以便导入,但有时它可以只需更改使用的 import 语句的样式即可。

假设有以下文件:

# one.pyfrom two import func_two
def func_one():    func_two()
# two.pyfrom one import func_one
def do_work():    func_one()
def func_two():    print("Hello, world!")
# main.pyfrom two import do_workdo_work()

如果我们运行 main.py,我们会得到以下结果:

% python main.pyTraceback (most recent calllast):File"main.py", line 2in <module>from two import do_workFile"two.py", line 2in <module>from one import func_oneFile"one.py", line 2in <module>from two import func_twoImportError: cannot importname'func_two'from partially initializedmodule'two' (most likely due to a circular import) (two.py)

   

   当 Python 导入模块时,它会逐行执行文件,文件中的每个全局变量(包括函数和类的顶级名称)都成为正在构造的模块对象的属性,在 two.py 中,我们在第 2 行从 one.py 导入,此时,模块已创建,但尚未定义任何属性,但我们尚未执行那些 def 语句,因此它们不存在,与函数调用一样,当运行 import 语句时,它开始执行导入的文件,直到导入完成才会返回当前文件。

one.py 的导入开始,其第 2 行尝试从 two 模块中获取名称,正如我们刚才所说,模块存在,但尚未定义名称,这给了我们错误。

我们可以导入整个模块,而不是从模块导入名称。我们所做的就是更改导入的形式,以及我们如何从导入的模块中引用函数,如下所示:

# one.pyimport two              
def func_one():    two.func_two()     
# two.pyimport one            
def do_work():    one.func_one()     def func_two():    print("Hello, world!")
# main.pyfrom two import do_workdo_work()

运行代码,我们得到:

% python main.pyHello, world!

    它之所以有效是因为 two.py 在第 2 行导入,然后 one.py 在其第 2 行导入,因为模块存在。它仍然像修复之前一样是空的,但现在我们不会尝试在导入期间在其中查找名称,一旦完成所有导入,和模块都定义了所有名称,我们可以从函数内部访问它们。

  这里的关键思想是“from two import func_two”在导入期间尝试查找,在它存在之前。通过使用“import two”将名称查找推迟到函数主体,可以让所有模块在我们尝试使用它们之前完全初始化,从而避免循环导入错误。

正如我在开始提到的,修复循环导入的最佳方法是构建代码,使模块没有这样的相互依赖关系,但这并不总是那么容易,这可以为你赢得一点时间让你的代码重新工作。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1920 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1920 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章