Короче говоря
PEP-557 представил классы данных в стандартной библиотеке Python, которые в основном могут заполнять та же роль, что и collections.namedtuple
и typing.NamedTuple
. И теперь мне интересно, как разделить варианты использования, в которых namedtuple по-прежнему является лучшим решением.
Преимущества классов данных перед NamedTuple
Конечно, вся заслуга dataclass
, если нам понадобится:
- изменяемые объекты
- поддержка наследования
property
декораторы, управляемые атрибуты- сгенерированные определения методов из коробки или настраиваемые определения методов
Преимущества классов данных кратко описаны в том же PEP: Почему бы просто не использовать namedtuple.
В: В каких случаях namedtuple по-прежнему является лучшим выбором?
Но как насчет противоположного вопроса для именованных кортежей: почему бы просто не использовать класс данных? Я думаю, что 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. вопрос никоим образом не дублирует тот, потому что здесь я спрашиваю о случаях strong>, в котором namedtuple лучше, а не о разнице (я проверил документы и источники, прежде чем спрашивать)
NamedTuple
в качестве входных данных дляnp.array
будет работать, потому что (как указано в принятом ответе)NamedTuple
наследуется отtuple
. Numpy не так гладко обрабатывает классы данных (рассматривая их как имеющие dtypeobject
). - person Jasha   schedule 28.07.2021