当前位置: 首页 > 知识库问答 >
问题:

解析Python类型提示的循环导入[duplicate]

司空实
2023-03-14

我有Python类,它们有彼此作为属性的实例

class A:
    def __init__(self, b: B) -> None:
        self.b = a

class B:
    def __init__(self, a: A) -> None:
        self.a = a

如果这些类是在同一个文件中定义的,那么这很好,但是在我的例子中,它们都非常大,我希望将它们移动到不同的文件中。但是,如果我这样做,我必须将B导入a.pya导入B.py,这将导致循环导入错误。有人知道我可以使用哪种模式将aB放在不同的文件中,保持类型暗示,并遇到循环导入错误吗?

共有1个答案

谷永贞
2023-03-14

对Python忽略引号中的类型提示:

class A:
    def __init__(self, b: 'B') -> None:
        self.b = a
class B:
    def __init__(self, a: 'A') -> None:
        self.a = a
 类似资料:
  • 问题内容: 我正试图将我的大班分成两部分;好吧,基本上是进入“主”类和具有其他功能的mixin的,就像这样: 文件: 文件: 现在,尽管这很好,但类型提示当然不起作用。我无法导入,因为会进行周期性导入,并且没有提示,我的编辑器(PyCharm)无法分辨出什么。 我正在使用Python 3.4,如果那里有解决方案,我愿意移至3.5。 有什么办法可以将我的班级分成两个文件并保留所有“连接”,以便我的I

  • 我试图把我庞大的班级一分为二;好的,基本上分为“main”类和带有附加函数的mixin,如下所示: 文件: 文件: 现在,虽然这很好,但是

  • 问题内容: 如果两个模块相互导入会怎样? 为了概括这个问题,Python中的循环导入又如何呢? 问题答案: 导入确实非常简单。只要记住以下几点: 和是可执行语句。它们在运行的程序到达该行时执行。 如果模块不在中,则导入将在中创建新的模块条目,然后在模块中执行代码。在执行完成之前,它不会将控制权返回给调用模块。 如果中确实存在一个模块,则无论导入是否完成执行,导入都会简单地返回该模块。这就是循环导入

  • 问题内容: 以下产生。我该如何解决? 问题答案: 您可以通过为尚未定义的类使用 字符串 名称来使用前向引用: __ 从Python 3.7开始 ,您还可以通过在模块顶部添加以下导入来推迟注释的 所有 运行时解析: 此时,注释将作为表达式的抽象语法树的字符串表示形式存储;您可以用来解决这些问题(并解决上面使用的前向引用)。 有关详细信息,请参见 PEP 563-批注的延迟评估 ;此行为将是Pytho

  • 问题内容: 所以我得到这个错误 并且你可以看到我进一步使用了相同的import语句,并且可以正常工作吗?关于循环导入是否有一些不成文的规定?如何在调用堆栈的更下方使用同一类? 问题答案: 我认为jpmc26的答案虽然绝非错误,但在循环进口上却过于严格。如果正确设置它们,它们可以正常工作。 最简单的方法是使用语法,而不是。前者几乎总是可以工作,即使包括在内也能使我们重新获得利益。后者只有在中已经定义

  • 以下内容产生了。我怎样才能解决它?