gpt4 book ai didi

python-3.7 - Python 嵌套数据类...这有效吗?

转载 作者:行者123 更新时间:2023-12-05 07:00:46 27 4
gpt4 key购买 nike

背景

我正在使用数据类来创建嵌套数据结构,我用它来表示复杂的测试输出。

以前我一直通过创建多个顶级数据类然后使用组合来创建层次结构:

from dataclasses import dataclass

@dataclass
class Meta:
color: str
size: float

@dataclass
class Point:
x: float
y: float
stuff: Meta

point1 = Point(x=5, y=-5, stuff=Meta(color='blue', size=20))

问题

我想知道是否有一种方法可以以独立的方式定义类,而不是用一堆较低级别的类来污染我的顶层。所以在上面,Point数据类的定义包含了Meta的定义,而不是顶层的定义。

解决方案?

我想知道是否有可能将内部(数据类)类与数据类一起使用并让一切正常工作。

所以我尝试了这个:

rom dataclasses import dataclass
from typing import get_type_hints


@dataclass
class Point:

@dataclass
class Meta:
color: str
size: float

@dataclass
class Misc:
elemA: bool
elemB: int

x: float
y: float
meta: Meta
misc: Misc


point1 = Point(x=1, y=2,
meta=Point.Meta(color='red', size=5.5),
misc=Point.Misc(elemA=True, elemB=-100))

print("This is the point:", point1)
print(point1.x)
print(point1.y)
print(point1.meta)
print(point1.misc)
print(point1.meta.color)
print(point1.misc.elemB)

point1.misc.elemB = 99
print(point1)
print(point1.misc.elemB)

这一切似乎都有效 - 打印输出都正常工作,并且对(子)成员元素的分配也有效。

您甚至可以支持嵌套元素的默认值:

from dataclasses import dataclass


@dataclass
class Point:

@dataclass
class Meta:
color: str = 'red'
size: float = 10.0

x: float
y: float
meta: Meta = Meta()


pt2 = Point(x=10, y=20)
print('pt2', pt2)

...正确打印出 pt2 的 red10.0 默认值

问题

这是实现嵌套数据类的正确方法吗?

(这意味着它现在能正常工作只是运气不好,但将来可能会崩溃?...或者它只是很糟糕,而不是你做事的方式?...或者它只是很糟糕?)

...与组合在一起的无数顶级“迷你”数据类相比,它肯定更清晰,更容易理解和支持一百万倍。

...这也比尝试使用 marshmellow 或将 json 模式偷工减料到类结构模型要容易得多。

...它也很简单(我喜欢)

最佳答案

您可以只使用字符串来注释尚不存在的类:

from dataclasses import dataclass

@dataclass
class Point:
x: float
y: float
stuff: "Meta"

@dataclass
class Meta:
color: str
size: float


point1 = Point(x=5, y=-5, stuff=Meta(color='blue', size=20))

这样,您就可以以最合理的方式对类定义进行重新排序。像 mypy 这样的静态类型检查器也尊重这种前向引用方式,它是 the initial pep on type annotation 的一部分。 ,所以没有什么异国情调。嵌套类也可以解决问题,但更难阅读,since flat is better than nested .

关于python-3.7 - Python 嵌套数据类...这有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64036267/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com