Data Classes vs typing.NamedTuple主要用例

7 浏览
0 Comments

Data Classes vs typing.NamedTuple主要用例

长话短说

PEP-557将数据类引入Python标准库,它基本上可以扮演与collections.namedtupletyping.NamedTuple相同的角色。现在我想知道在哪些情况下,命名元组仍然是更好的解决方案。

数据类优于命名元组的优势

当然,所有的功劳都归功于dataclass,如果我们需要:

  • 可变对象
  • 继承支持
  • property装饰器,可管理的属性
  • 开箱即用的生成方法定义或可定制的方法定义

数据类的优势在同一PEP中简要解释:为什么不只使用命名元组

问题:在哪些情况下,命名元组仍然是更好的选择?

但是对于命名元组来说,反过来问一个问题:为什么不只使用数据类?

我猜可能是从性能的角度来看,命名元组更好,但尚未找到确认的证据。

示例

让我们考虑以下情况:

我们将在一个小容器中存储页面的尺寸,具有静态定义的字段、类型提示和命名访问。不需要进一步的哈希、比较等操作。

命名元组方法:

from typing import NamedTuple
PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])

数据类方法:

from dataclasses import dataclass
@dataclass
class PageDimensions:
    width: int
    height: int

哪种解决方案更可取?为什么?

附注:这个问题与那个问题完全不同,因为我在这里问的是命名元组更好的情况,而不是它们之间的区别(在提问之前我已经查阅了文档和源代码)。

0