PEP-557 представил классы данных в стандартной библиотеке Python, которые по сути могут выполнять ту же роль, что и Collections.namedtuple и типизация. NamedTuple. И теперь мне интересно, как разделить случаи использования, в которых NamedTuple по-прежнему является лучшим решением.
Преимущества классов данных перед NamedTuple
Конечно, вся заслуга принадлежит классу данных, если нам нужны:
- изменяемые объекты
поддержка наследования - декораторы, управляемые атрибуты
Код: Выделить всё
property - сгенерированные определения методов из коробки или настраиваемые определения методов
Вопрос: В каких случаях Nametuple все же является лучшим выбором?
А как насчет противоположного вопроса для Nametuples: почему бы просто не использовать класс данных?
Я думаю, что Nametuple лучше с точки зрения производительности, но пока не нашел подтверждения этому.
Пример
Давайте рассмотрим следующую ситуацию:
Мы собираемся хранить размеры страниц в небольшом контейнере со статически определенными полями, подсказкой типа. и именованный доступ. Никакого дальнейшего хеширования, сравнения и т. д. не требуется.
Подход NamedTuple:
Код: Выделить всё
from typing import NamedTuple
PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])
Код: Выделить всё
from dataclasses import dataclass
@dataclass
class PageDimensions:
width: int
height: int
P.S. этот вопрос ни в коем случае не является дубликатом этого, потому что здесь я спрашиваю о случаях, в которых Nametuple лучше, а не о разнице (я я проверил документацию и источники, прежде чем спрашивать)
Подробнее здесь: https://stackoverflow.com/questions/516 ... -use-cases
Мобильная версия