Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否存在任何非递归dataclass.astuple?_Python_Python Dataclasses - Fatal编程技术网

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好吧,我试着在文档中搜索:)并不是说我无法以某种方式解决这个问题(例如,像你提出的解决方案或编写我自己的函数),但我过去认为应该有某种规范的方式来解决它,在我看来,这个用例似乎很自然。