【问题标题】:python ImportError: cannot import name [duplicate]python ImportError:无法导入名称[重复]
【发布时间】:2017-06-20 03:24:46
【问题描述】:

我的代码有点复杂,所以我举个例子:

文件 A.py:

from B import B

class A():

def __init__(self):

    self.id = 5

    self.b = B()

文件 B.py

from A import A

class B():

def __init__(self):

    self.id = 15

    self.a = A()

这是我得到的例外:

 Traceback (most recent call last):
 File "F:/Project/Code/A.py", line 1, in <module>
 from B import B
 File "F:\Project\Code\B.py", line 1, in <module>
 from A import A
 File "F:\Project\Code\A.py", line 1, in <module>
 from B import B
 ImportError: cannot import name B

我想要的只是 A 包含 B 的实例,B 包含 A 的实例。我知道我所要做的就是将它们转换为单个文件,但我不想这样做,我的代码是在更大的范围内,我的老师强迫我保留多个短脚本而不是一个长代码。

任何建议将不胜感激。

【问题讨论】:

  • “我想要的只是 A 包含 B 的实例和 B 包含 A 的实例” - 即使您解决了循环导入问题,这仍然是一个根本性的设计。一个 A 包含一个 B,另一个 A 包含另一个 B,等等。创建其中一个对象需要您创建无限数量的对象。
  • 我想他可以以某种方式指定最大创建递归深度,但这是一个相当沉重的元主题
  • 作为解决文字问题的骗局关闭:ImportError。至于能够在反对创建时以不会导致无限递归的方式设置交叉引用(假设可以为包含的对象的成员重用 AB 的实例),那需要一个单独的问题。

标签: python oop scripting importerror


【解决方案1】:

您所拥有的称为导入循环。你如何着手修复是将相互依赖的代码移动到一个类C,然后两者都引用。

C.py:

def class C:

    def __init__(self):
        # Do some stuff

    # other methods

A.py:

 from C import C

 def class A(C):

     def __init__(self):
        # Do some stuff in A

     # other methods

B.py:

from C import C

def class B(C):

    def __init__(self):
        # Do some stuff in B

    # other methods

【讨论】:

    【解决方案2】:

    您不能有双向依赖,因为这意味着A 中的每个b 属性都是一个B 实例,其中包含自己的A,依此类推。

    A
    - id: 5
    - b: B
         - id: 15
         - a: A
              - id: 15
              - b: B ...
    

    【讨论】:

      【解决方案3】:

      您收到错误是因为您的脚本具有递归导入。

      A.py 依赖于 B module。但是B.py 依赖于A module。而且 Python 无法解析导入。

      您可以在一个模块中编写所有类。或者确保没有循环依赖。

      同样的问题也可能出现在变量、函数的导入上。

      【讨论】:

      • 如果有人想讨论它。用 cmets 写给我。我不明白为什么我的答案没有用。
      • 感谢回滚...
      • 哦——我把它读作回滚编辑,而不是回滚投票,因此检查了编辑历史(我对上述内容的第一次阅读是对其他人回滚编辑的讽刺回应你认为很好)。抱歉,那里。
      • @CharlesDuffy 没问题。一切顺利。谢谢。
      猜你喜欢
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2016-10-02
      • 2014-09-27
      • 2020-04-09
      相关资源
      最近更新 更多