使用自引用类型提示创建递归数据类

Rom*_*ode 25 python type-hinting recursive-datastructures python-dataclasses

我想用 Python 编写数据类定义,但无法在声明中引用同一类。

我主要想要实现的是这个嵌套结构的类型,如下图所示:

 @dataclass
 class Category:
     title: str
     children: [Category] # I can't refer to a "Category"
  
 tree = Category(title='title 1', children=[
     Category('title 11', children=[]),
     Category('title 12', children=[])
 ])
Run Code Online (Sandbox Code Playgroud)

rv.*_*tch 31

选项1

您可以将类名包装在字符串中以便前向声明注释:

from dataclasses import dataclass
from typing import List


@dataclass
class Category:
    title: str
    children: List['Category']
Run Code Online (Sandbox Code Playgroud)

选项#2

您可以包含__future__导入,以便默认情况下对所有注释进行前向声明,如下所示。在这种情况下,您还可以消除typing导入并使用Python 3.7及更高版本中的新样式注释。

from __future__ import annotations

from dataclasses import dataclass


@dataclass
class Category:
    title: str
    children: list[Category]
Run Code Online (Sandbox Code Playgroud)

  • 关于选项 #2 的警告:来自 [PEP 563](https://www.python.org/dev/peps/pep-0563/) 的类型提示的“新”样式被推迟成为 Python 3.10 的默认样式,因为另一种提案 [PEP 649](https://www.python.org/dev/peps/pep-0649/) 指出了它的一些缺点,并提供了略有不同的解决方案。PEP 649 似乎最终可能会被采用,但目前尚不清楚过渡计划是什么。它应该为像这样的前向引用提供相同的好处,但可能需要不同的“__future__”导入才能启用。 (4认同)