PEP-557在Python标准库中引入了数据类,该类基本上可以充当collections.namedtuple
和的角色typing.NamedTuple
。现在,我想知道如何将用例分隔,其中namedtuple仍然是更好的解决方案。
当然,dataclass
如果需要,所有功劳都归功于:
在同一PEP中简要说明了数据类的优点:为什么不只使用namedtuple。
但是对于namedtuples来说,一个相反的问题呢:为什么不只使用数据类呢?从性能的角度来看,我认为namedtuple可能更好,但尚未对此进行确认。
让我们考虑以下情况:
我们将页面尺寸存储在一个具有静态定义字段,类型提示和命名访问权限的小容器中。不需要进一步的散列,比较等。
NamedTuple方法:
from typing import NamedTuple
PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])
DataClass方法:
from dataclasses import dataclass
@dataclass
class PageDimensions:
width: int
height: int
哪种解决方案更可取,为什么?
PS问题是不是重复是一个以任何方式,因为在这里我想询问
情况 ,其中namedtuple比较好,不是 区别 (我问之前已经检查文档和源)
这取决于您的需求。他们每个人都有自己的利益。
这是对PyCon 2018 Raymond
Hettinger
上的数据类的很好的解释-数据类:结束所有代码生成器的代码生成器
在 Dataclass
所有实现中NamedTuple
,都是使用 Python编写的
,而在in中,所有这些行为都是免费的,因为它们是NamedTuple
从继承的tuple
。并且由于 tuple
结构是用C编写的,因此标准方法的速度更快NamedTuple
(哈希,比较等)。
另请注意, Dataclass
基于,dict
而 NamedTuple
基于tuple
。因此,使用这些结构具有优点和缺点。例如,使用可以减少空间使用量NamedTuple
,但是使用可以更快地访问时间Dataclass
。
请看我的实验:
In [33]: a = PageDimensionsDC(width=10, height=10)
In [34]: sys.getsizeof(a) + sys.getsizeof(vars(a))
Out[34]: 168
In [35]: %timeit a.width
43.2 ns ± 1.05 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [36]: a = PageDimensionsNT(width=10, height=10)
In [37]: sys.getsizeof(a)
Out[37]: 64
In [38]: %timeit a.width
63.6 ns ± 1.33 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
但是随着NamedTuple
访问时间的属性数量增加,它保持不变的很小,因为它为每个属性创建一个带有该属性名称的属性。例如,对于我们来说,新类的名称空间部分将如下所示:
from operator import itemgetter
class_namespace = {
...
'width': property(itemgetter(0, doc="Alias for field number 0")),
'height': property(itemgetter(0, doc="Alias for field number 1"))**
}
在哪些情况下namedtuple仍然是更好的选择?
当您的数据结构需要/可以 不可变,可哈希,可迭代,不可打包,可比较时,可以使用NamedTuple
。 例如, 如果您需要
更复杂的内容,则可以继承 数据结构Dataclass
。
PEP-557在Python标准库中引入了数据类,基本上可以充当与< code > collections . named tuple 和< code>typing相同的角色。命名元组。现在我想知道如何区分命名元组仍然是更好的解决方案的用例。 当然,如果我们需要: 可变对象 继承支持 装饰器,可管理属性 生成的现成方法定义或可自定义的方法定义 数据类的优点在同一个PEP中简要说明:为什么不直接使用
问题内容: 考虑以下代码: 上面的代码只是演示我正在尝试实现的方法。我想使用类型提示。 您知道如何以一种优雅的方式达到预期效果吗? 问题答案: 自3.6以来,类型化命名元组的首选语法为 编辑 从Python 3.7开始,请考虑使用(您的IDE可能尚不支持它们进行静态类型检查):
我有一个数据表与形式输入。 这就是我创造它的方式 我使用以下方法将数据表值传递给控制器 但是当我使用ajax函数提交数据时,我会在expdate列的输入值上得到html标记。我怎样才能得到真正的价值?解释我
从Kafka Streams 2.5.0开始,拓扑似乎必须包含一个输入主题。在Kafka2.4.1(以及更早的版本)中,情况并非如此。 我有一个应用程序,其中的拓扑只是创建一些全局状态存储,从其他应用程序写入的主题中读取数据。 使用Kafka 2.5.0,我得到以下错误: 如果添加一个虚拟输入主题(例如,通过),应用程序启动良好。 这种行为是意料之中的,还是Kafka Streams 2.5.0中
我正在使用MPAndreidChart-v2.1.6,我面临以下问题。 我尝试了和属性来处理那个特定的条件,但没有任何积极的结果发生在我身上。当我有多个条目时,它运行良好。 这是我的密码, 提前感谢,
如果我更改为: 代码运行良好-但我想转换工作。