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]