В чем разница между namedtuple и функцией type - PullRequest
2 голосов
/ 02 июня 2019

Я недавно посетил форум с приемами Python и наткнулся на это:

>>> Points = type("Points", (object,), {'x' : None, 'y' : None})
>>> Player = Points()
>>> Player.x = 23
>>> Player.y = 54
>>> Player.x
23
>>> Player.y - Player.x
31
...

Этот синтаксис напоминает мне синтаксис именованных кортежей:

>>> from collections import namedtuple
>>> Points = namedtuple("Points", ['x', 'y'])
>>> Player = Points(
    x = 23,
    y = 54
)
>>> Player.x
23
>>> Player.y - Player.x
21
...

И я не могу понятькак они отличаются, за исключением того, что именованные кортежи не могут быть изменены и имеют индексацию.Какие преимущества назвали кортежи и функции типа и что лучше использовать в наших проектах?

1 Ответ

0 голосов
/ 02 июня 2019

Давайте окунемся в исходный код!

Сначала рассмотрим определение namedtuple:

result = type(typename, (tuple,), class_namespace)

class_namespace содержит имена полей:

    for index, name in enumerate(field_names):
        doc = _sys.intern(f'Alias for field number {index}')
        class_namespace[name] = _tuplegetter(index, doc)

namedtuple по существу создает объект, производный от tuple, где ваш первый пример создает объект из базы object.

Заключение

Вы можете проверить этот ответ , чтобы увидеть разницу в памяти между ними. Вам решать, какой из них использовать, основываясь на удобочитаемости и других вещах, которые вы хотели бы использовать с этим объектом. Я бы сказал, что, основываясь на ответе выше, взглянув на ваш пример кода, я выбрал бы namedtuple (или версию typing, которая даже круче!:

class Employee(NamedTuple):
    name: str
    id: int

)

...