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

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

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

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


person LightCC    schedule 07.05.2020    source источник
comment
Нет, он в любом случае обертывает collections.namedtuple, хотя для этого он использует некоторую сбивающую с толку магию метакласса, из-за чего некоторые вещи ведут себя странно. См., например, этот вопрос   -  person juanpa.arrivillaga    schedule 07.05.2020
comment
Итак, чтобы быть явным, вы можете подумать, что если вы создаете класс Foo(NamedTuple), а затем создаете экземпляр объекта foo = Foo(bar, baz), то isinstance(foo, NamedTuple) будет True, но это не так... Конечно, это симметрично с isinstance(foo, collections.namedtuple), но в основном это более очевидно, что namedtuple является фабрикой классов, тогда как NamedTuple по существу использует механизм метакласса, чтобы действовать как фабрика вызовов, не являясь при этом надлежащим родительским классом. Но практичность побеждает чистоту.   -  person juanpa.arrivillaga    schedule 07.05.2020
comment
@ juanpa.arrivillaga Вы можете преобразовать это в ответ ... Это кажется довольно тщательным. :)   -  person LightCC    schedule 07.05.2020