首页 > 解决方案 > 周围有非递归的 dataclass.astuple 吗?

问题描述

dataclasses.astuple是递归的(根据文档):

每个数据类都转换为其字段值的元组。数据类、字典、列表和元组被递归到。

确实,考虑示例:

In [1]: from dataclasses import dataclass, astuple
   ...: from typing import List
   ...:
   ...: @dataclass
   ...: class Point:
   ...:     x: float
   ...:     y: float
   ...:
   ...: @dataclass
   ...: class Side:
   ...:     left: Point
   ...:     right: Point
   ...:
   ...: side = Side(Point(2, 3), Point(1, 2))
   ...: astuple(side)
   ...:
   ...:
Out[1]: ((2, 3), (1, 2))

是否有任何简单的内置方法来获得二元组的点(Point(x=2, y=3), Point(x=1, y=2))

标签: pythonpython-dataclasses

解决方案


没有预先构建的方法来解压缩dataclass. 但是,它可以很容易地定义:

from dataclasses import fields

def unpack(dc) -> tuple:
    return tuple(getattr(dc, field.name) for field in fields(dc))

这可以将任何解包dataclass到一个元组:

>>> unpack(side)
(Point(x=2, y=3), Point(x=1, y=2))

推荐阅读