Есть ли причина использовать collections.namedtuple вместо typing.NamedTuple в Python?

Я использовал collections.namedtuple в каком-то коде, но теперь я вижу, что в Python 3.6 есть новый typing.NamedTupleбазовый класс доступен в новом стиле класса. Кроме того, похоже, что подсказки типов доступны для именованных индексов в кортеже.

Есть ли причина продолжать использовать старую collections.namedtuple (из Python 2.6) во вновь написанном коде, помимо совместимости со старым кодом?

т.е. есть ли преимущество в производительности, используется ли меньше памяти и т. д.?

1 ответ

К сожалению, в настоящее время не поддерживает миксины. Так, например (вырезая приведенный ниже пример из обсуждения этой проблемы ), мы можем создать перечисление, которое наследует все свойства отcollections.namedtuplemixin, но мы не можем сделать то же самое сtyping.NamedTupleкоторые мы могли бы пожелать, чтобы получить подсказки типов бесплатно:

      >>> from enum import Enum
>>> from collections import namedtuple
>>> TTuple = namedtuple('TTuple', 'id a blist')
>>> class NTEnum(TTuple, Enum):
...     NONE = TTuple(0, 0, [])
...     A = TTuple(1, 2, [4])
...     B = TTuple(2, 4, [0, 1, 2])
... 
>>> NTEnum.A
<NTEnum.A: TTuple(id=1, a=2, blist=[4])>
>>> 
>>> NTEnum.A.id
1
>>> NTEnum.B.blist
[0, 1, 2]
Другие вопросы по тегам