首页 > 解决方案 > 如何将数据类的属性注释为另一个数据类的对象?

问题描述

我有两个数据类,例如:

from dataclasses import dataclass
from pathlib import Path

@dataclass
class InnerDataClass:
    host: str

@dataclass
class OuterDataClass:
    directory: Path
    host: InnerDataClass

当我调用 时OuterDataClass(...),PythonNameError: name 'InnerDataClass' is not defined在最后一行返回错误。为什么会这样,我该如何解决?

标签: pythonannotationstype-hintingpython-typingpython-dataclasses

解决方案


您的示例实际上有效,您的实际代码中可能有相反的类顺序。Python 代码文件逐行执行,所以当第一个类的类主体被执行时,第二个类需要已经存在。如果你想让事情正常工作,你必须按照从下到上匹配其内部层次结构的顺序声明类。


但是,如果您所做的只是注释而不是实际创建实例,您也可以这样做:

from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path


@dataclass
class OuterDataClass:
    directory: Path
    host: InnerDataClass

@dataclass
class InnerDataClass:
    host: str

作为代码文件的第一行运行from __future__ import annotations将使注释工作,无论定义的顺序类如何。它作为PEP 563被引入以帮助解决循环依赖等问题。


推荐阅读