Python 3.5+中的递归类型[重复]

Posted

技术标签:

【中文标题】Python 3.5+中的递归类型[重复]【英文标题】:Recursive Typing in Python 3.5+ [duplicate] 【发布时间】:2016-11-15 09:35:29 【问题描述】:

在 Python 3.5 中,添加了类型注释(请参阅 here)。

有没有定义递归类型注释的方法,例如树状结构?

class Employee(object):
    def __init__(self, name: str, reports: List[Employee]):
       self.name = name
       self.reports = reports

在上面,注释List[Employee] 似乎不起作用。运行代码会导致这个错误:

NameError: name 'Employee' is not defined

【问题讨论】:

【参考方案1】:

您可以使用 PEP 484 中定义的Forward References

这种情况经常发生的情况是定义 容器类,其中定义的类出现在签名中 的一些方法。例如,下面的代码(开始 一个简单的二叉树实现)不起作用:

class Tree:
    def __init__(self, left: Tree, right: Tree):
        self.left = left
        self.right = right

为了解决这个问题,我们写:

class Tree:
    def __init__(self, left: 'Tree', right: 'Tree'):
        self.left = left
        self.right = right

允许使用字符串文字作为类型提示的一部分,例如 示例:

class Tree:
    ...
    def leaves(self) -> List['Tree']:

【讨论】:

请注意,从 Python3.10 开始,这将不是必需的,并且可以通过from __future__ import annotations 选择性地避免,请参阅docs.python.org/3.8/library/__future__.html 底部的表格

以上是关于Python 3.5+中的递归类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python 3.5的Python OpenCV导入错误

python 3.5代码中的变量需要类型注释

python 3.5+中的类型提示克隆函数

当我在 mac 上安装了 python 3.5 时,终端运行 python 2.7。

Python中的递归函数不会更改列表[重复]

无法将 Python 3 (3.5) 带入 venv [重复]