Python 3.5+中的递归键入

nim*_*mda 13 python recursion type-hinting python-3.x

在Python 3.5中,添加了类型注释(参见此处).

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

class Employee(object):
    def __init__(self, name: str, reports: List[Employee]):
       self.name = name
       self.reports = reports
Run Code Online (Sandbox Code Playgroud)

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

NameError: name 'Employee' is not defined

Bre*_*bel 22

您可以使用PEP 484中定义的前向参考

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

class Tree:
    def __init__(self, left: Tree, right: Tree):
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

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

class Tree:
    def __init__(self, left: 'Tree', right: 'Tree'):
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

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

class Tree:
    ...
    def leaves(self) -> List['Tree']:
Run Code Online (Sandbox Code Playgroud)

  • 请注意,从 Python3.10 开始,这不是必需的,并且可以选择使用“from __future__ import comments”来避免,请参阅 https://docs.python.org/3.8/library/__future__.html 底部的表格 (5认同)
  • 请注意,Python 3.10 的注释更改最终导致了问题,但在 3.10 中收回它为时已晚,因此存在再次更改它的讨论。例如,请参阅 [PEP-649](https://peps.python.org/pep-0649/)。 (2认同)