Каковы основные различия между NamedTuple и TypedDict в Python / mypy - PullRequest
0 голосов
/ 21 ноября 2018

Мне кажется, что NamedTuple и TypedDict довольно похожи, и сами разработчики Python признали это.

Что касается PEP, я бы скорее добавил общий раздел о NamedTuple и TypedDict., они очень похожи, и последний уже ведет себя структурно.Как вы думаете? source

Но тогда Гвидо, похоже, не уверен в этом.

Я не уверен, что NamedTuple и TypedDict действительно очень похожи(за исключением того, что они оба пытаются справиться с устаревшими образцами в статически типизированном мире).

source

Итак, это моя ленивая попытка кого-то найтиеще придумайте четкое сравнение, когда официальной документации не хватает.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

NamedTuple - это определенный тип.Как следует из названия, это кортеж, расширенный для именованных записей.

TypedDict не является реальным объектом, вы не можете (или, по крайней мере, не должны) его использовать, вместо этого он используетсядля добавления информации о типе (для средства проверки типов mypy), чтобы аннотировать типы в сценариях, когда в словаре есть различные ключи с различными типами, то есть практически во всех местах, где следует использовать NamedTuple.Очень полезно аннотировать существующий код, который вы не хотите реорганизовывать.

0 голосов
/ 21 ноября 2018

Python и его сообщество борются с проблемой "struct": как наилучшим образом сгруппировать связанные значения в составные объекты данных, которые обеспечивают логический / легкий доступ к компонентам (обычно по имени).Существует много конкурирующих подходов:

  • collections.namedtuple экземпляров
  • словарей (с фиксированным / известным набором ключей)
  • attribute-доступные словари (например, stuf )
  • attrs библиотека
  • PEP 557 классы данных
  • обычный старыйсделанные на заказ объекты, созданные вручную для каждого типа структуры
  • последовательности, такие как tuple и list с подразумеваемым значением для каждой позиции / слота (архаичный, но чрезвычайно распространенный)
  • и т. д.

Так много для "Должен быть один - и желательно только один - очевидный способ сделать это".

И библиотека typing, и Mypy, как и сообщество Python в целом, одновременноборется с тем, как более эффективно определять типы / схемы, в том числе для составных объектов.Обсуждение, с которым вы связаны, является частью этой борьбы и попытки найти путь вперед.

NamedTuple - это суперкласс для структурированных объектов, созданный на фабрике collections.namedtuple;TypedDict попытка Mypy определить ключи и соответствующие типы значений, возникающие при использовании словарей с фиксированной схемой.Они похожи, если вы просто думаете: «У меня есть фиксированный набор ключей, которые должны соответствовать фиксированному набору типизированных значений».Но полученные реализации и ограничения очень разные.Сумка и коробка похожи?Может быть.Возможно, нет.Зависит от вашей точки зрения и от того, как вы хотите их использовать.Залейте вино и позвольте начать обсуждение!

NamedTuple, кстати, теперь является формальной частью Python.

from typing import NamedTuple

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

TypedDict - это не часть собственно Python, а экспериментальная функция Mypy, позволяющая печатать на разнородных, ориентированных на структуру использования словарях.

from mypy_extensions import TypedDict

Movie = TypedDict('Movie', {'name': str, 'year': int})

Несмотря на их различия, NamedTuple и TypedDict блокируют конкретные ключи, которые будут использоваться, и типы значений, соответствующие каждой клавише.Поэтому они стремятся в основном к одной и той же цели: быть полезными механизмами типизации для составных / структурных типов.

Стандарт Python typing.Dict фокусируется на гораздо более однородных, параллельных отображениях, определяя типы ключ / значение, а не ключи per se .Поэтому он не очень полезен для определения составных объектов, которые хранятся в словарях.

ConnectionOptions = Dict[str, str] 
...