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

Python 3的类型提示中的自引用类型[重复]

尉迟越
2023-03-14

有没有办法在类中定义参数的类型,以便该类型引用自身?

例如,以下内容不会运行:

from typing import List

class Node:
    def __init__(self, val: int=0, neighbors: List[Node]=[]):
        self.val = val
        self.neighbors = neighbors

错误:

Traceback (most recent call last):
  File "node.py", line 3, in <module>
    class Node:
  File "node.py", line 4, in Node
    def __init__(self, val: int=0, neighbors: List[Node]=[]):
NameError: name 'Node' is not defined

共有1个答案

闾丘霖
2023-03-14

这里最好的解决方案是使用Python 3.7,它增加了对PEP 563:注释延迟计算的支持。在这种情况下,您需要做的就是添加:

from __future__ import annotations

到源文件的顶部,这将启用延迟注释评估(通过不尝试评估注释,使代码运行更快,除非在类似mypy的分析器下运行)。

如果没有3.7,您将无法使用使用字符串注释的旧PEP 484正向引用方法:

def __init__(self, val: int=0, neighbors: List['Node']=[]):

请注意节点周围的引号,它推迟了对类型的评估,前提是该类型将在以后定义。

 类似资料:
  • 问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,

  • 我实现了一个这样的树 但是在 PyCharm 中,我得到有解决方法吗?

  • 问题内容: 我想允许使用Python 3进行类型提示,以接受某个类的子类。例如: 现在,当输入以下代码时: 我得到一个PyCharm IDE提示“期望的类型A,取而代之的是Type [B]。” 如何更改此处的类型提示以接受A的任何子类型? 据此(https://www.python.org/dev/peps/pep-0484/#type-definition- syntax ,“该类型的参数也接受

  • 我希望允许使用Python 3进行类型提示以接受某个类的子类。例如。: 现在当键入以下代码时: 我收到一个 PyCharm IDE 提示“预期的类型 A,而是获得类型 [B]。 如何在这里更改类型提示以接受? 根据PEP 484(“类型为特定参数类型的子类型的表达式也可用于该参数。”),我知道我的解决方案< code>(cls: A)应该可以工作?

  • 有没有办法消除警告: 未解决的引用'DeviceManager'... 对于这种单例模式? 截图:

  • 我试图在Python3.5中使用类型提示。1,代码如下: 我猜在解析类型A时,类型A还没有完全构造,这是范围界定的问题,但我不理解为什么这样的语法不正确。是否有其他方式来表达它,或者它只是一个非法的构造? 我想在基类中使用这个语法提示,它可以在树状层次结构中组成派生类。