【问题标题】:How to annotate a dataclass' attribute as another dataclass' object?如何将数据类的属性注释为另一个数据类的对象?
【发布时间】:2021-09-18 22:22:51
【问题描述】:

我有两个数据类,例如:

from dataclasses import dataclass
from pathlib import Path

@dataclass
class InnerDataClass:
    host: str

@dataclass
class OuterDataClass:
    directory: Path
    host: InnerDataClass

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

【问题讨论】:

  • 我没有收到任何错误...您使用的是什么版本?
  • 版本 Python 3.8.6
  • 在 3.8.5 中工作

标签: python annotations type-hinting python-typing python-dataclasses


【解决方案1】:

您的示例确实有效,您的实际代码中可能有相反的类顺序。 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,以帮助解决循环依赖等问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多