【问题标题】:Python: Circular Import error, eventhough no "from ... import ..." usedPython:循环导入错误,即使没有使用“来自 ... 导入 ...”
【发布时间】:2022-01-09 18:46:38
【问题描述】:

我正在努力解决循环导入问题。我的设置如下:

模块a.py:

import b

class A():
    pass

模块b.py:

import a

class Bar(a.A):
    pass

注意模块b中的循环导入:需要从模块a访问类A,因为B继承自A。

最后是主模块main.py:

import a

# ...

当我运行 main.py 时,我收到此错误:

$ python3 main.py
Traceback (most recent call last):
  File "/home/.../main.py", line 1, in <module>
    import a
  File "/home/.../a.py", line 1, in <module>
    import b
  File "/home/.../b.py", line 3, in <module>
    class Bar(a.A):
AttributeError: partially initialized module 'a' has no attribute 'A' (most likely due to a circular import)

我认为,解决循环导入的一种方法是不使用 from ... import ... 语句,正如您所见,我没有这样做。但是为什么我仍然会收到这个错误呢?

编辑:我当前的代码结构要求 A 和 B 是单独的模块。不过,在这个video中,他使用的是和我类似的结构,他没有问题……

【问题讨论】:

  • 要问一个问题:为什么a.py需要导入b?你能避免吗?
  • @9769953 不,我无法避免,因为a.py 也可以访问来自b 的内容
  • a.py 不得 import b。如果A 需要来自B 的东西,那么你的类/代码结构是错误的,那么可能将A 和B 放在同一个文件中。
  • 然后创建第三个模块c,在其中放置Bar的类定义。
  • 但是如果 a 需要 b,b 需要 a,您可能希望首先重组您的模块(一个建议在上面的评论中)。

标签: python class circular-dependency


【解决方案1】:

在这种情况下,理想的答案通常是

  • 合并文件或其内容(您真的需要更多文件吗?)
  • 创建第三个文件并将共享内容放入其中(避免破坏现有导入,因为您可以简单地将所需内容从共享库导入现有库)
  • 创建一个导入两者的第 3 个文件(使用第 3 方库更简洁,但可能会破坏现有逻辑)
import a
import b

class Bar(a.A):
    pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多