长话短说
PEP-557 向 Python 标准库引入了数据类,其基本上可以扮演与collections.namedtuple
和typing.NamedTuple
相同的角色。现在我在想如何区分仍然更适合使用namedtuple的用例。
Data classes 相对 NamedTuple 的优势
当然,如果我们需要:
- 可变对象
- 继承支持
property
修饰符,可管理属性- 开箱即用或可自定义方法定义生成
所有的优势归功于dataclass
,同样的这些优势在同一 PEP 中得到了简要解释:为什么不仅仅使用namedtuple.
Q: 在什么情况下,namedtuple 仍然是更好的选择?
但对于namedtuples,反过来问一个相反的问题:为什么不仅仅使用dataclass? 我猜可能从性能的角度来看,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
哪种解决方案更好,为什么?
P.S. 这个问题与那个完全不同,因为我在这里询问的是namedtuple更好的情况,而不是它和其他方式的区别(在提问之前我已经检查了文档和来源)
NamedTuple
列表作为np.array
的输入将“正常工作”,因为(如接受的答案中所述)NamedTuple
继承自tuple
。Numpy 不能像处理dtype
为object
的数据类一样平稳地处理它们。 - Jasha