Python 是否存在任何非递归dataclass.astuple?
Python 是否存在任何非递归dataclass.astuple?,python,python-dataclasses,Python,Python Dataclasses,dataclasses.astuple是递归的(根据: 每个数据类都转换为其字段值的元组。数据类、dict、列表和元组递归到 确实,考虑例子: In [1]: from dataclasses import dataclass, astuple ...: from typing import List ...: ...: @dataclass ...: class Point: ...: x: float ...: y: float ..
dataclasses.astuple
是递归的(根据:
每个数据类都转换为其字段值的元组。数据类、dict、列表和元组递归到
确实,考虑例子:
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))
是否有任何简单的内置方法来获取两个元组的点,即点(x=2,y=3),点(x=1,y=2))。但是,它可以很容易地定义:
从数据类导入字段
def解包(dc)->元组:
返回元组(字段中字段的getattr(dc,field.name))
这可以将任何dataclass
解压为一个元组:
>>打开包装(侧面)
(点(x=2,y=3),点(x=1,y=2))
< /代码> 一种替代方法,它使用与MisterMiyagi的答案相同的内核,但通过利用迭代器协议,使结果与现有的Python工具有更多的重用性和协作性,请考虑此数据组特定的混合:
从数据类导入字段中,是\u数据类
类dcmixin:
定义(自我):
如果不是,则为_数据类(自身):
raise TypeError(f“此mixin仅为数据类,{type(self)}不是数据类”)
返回(字段(self)中字段的getattr(self,field.name))
如果将其混合到数据类中,则可以使用标准的tuple
内置函数将实例转换为tuple,包括任何其他需要iterable的工具(例如list()
,set()
,或将其用作for循环中的参数)。由于定义不会递归到其字段值中,因此生成的容器保持平坦:
>@dataclass
... 类点(解包dcmixin):
... x:浮动
... y:浮子
...
>>>@dataclass
... 类端(解包dcmixin):
... 左:点
... 右图:要点
...
>>>侧面=侧面(点(2,3),点(1,2))
>>>元组(侧)#插入到容器构造函数中。。。
(点(x=2,y=3),点(x=1,y=2))
>>>对于边中的点:#…或其他可编辑上下文
... 打印(点)
点(x=2,y=3)
点(x=1,y=2)
到目前为止,您尝试了什么?为什么不直接使用side.left,side.right
?@MisterMiyagi好吧,我试着在文档中搜索:)并不是说我无法以某种方式解决这个问题(例如,像你提出的解决方案或编写我自己的函数),但我过去认为应该有某种规范的方式来解决它,在我看来,这个用例似乎很自然。