gpt4 book ai didi

python - Python/mypy 中 NamedTuple 和 TypedDict 的主要区别是什么

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:16 25 4
gpt4 key购买 nike

在我看来,NamedTupleTypedDict 非常相似,Python 开发人员自己也认识到这一点。

Concerning the PEP, I would rather add a common section about NamedTuple and TypedDict, they are quite similar and the latter already behaves structurally. What do you think? source

但 Guido 似乎对此不太确定。

I'm not so sure that NamedTuple and TypedDict are really all that similar (except they are both attempts to handle outdated patterns in a statically-typed world).

source

所以,这是我懒惰的尝试,试图让其他人在官方文档似乎缺乏的地方提出一个清晰的比较。

最佳答案

Python 及其社区正在努力解决“结构”问题:如何最好地将相关值分组到复合数据对象中,以允许对组件进行逻辑/轻松访问(通常通过名称)。有许多相互竞争的方法:

  • collections.namedtuple 个实例
  • 字典(带有一组固定/已知的键)
  • 属性可访问的字典(如 stuf )
  • attrs图书馆
  • PEP 557 dataclasses
  • 为每种结构类型手工制作的普通旧定制对象
  • tuplelist 这样的序列,每个位置/槽都有隐含意义(古老但非常常见)
  • 等等

“应该有一个——最好只有一个——显而易见的方法来做到这一点。”

typing 库和 Mypy,就像整个 Python 社区一样,同时在努力研究如何更有效地定义类型/模式,包括复合对象。您链接到的讨论是摔跤的一部分,并试图找到前进的道路。

NamedTuplecollections.namedtuple 工厂产生的结构化对象的类型父类(super class); TypedDict Mypy 尝试定义使用固定模式字典时出现的键和相应类型的值。如果您只是想“我有一组固定的键应该映射到一组固定的类型值”,它们是相似的。但是由此产生的实现和约束是非常不同的。袋子和盒子相似吗?或许。也许不会。取决于您的观点以及您希望如何使用它们。倒酒,开始讨论!

顺便说一下,

NamedTuple 现在是 Python 的正式组成部分。

from typing import NamedTuple

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

TypedDict 最初是作为 Mypy 的一项实验性功能出现的,目的是将打字纳入异构的、面向结构的字典使用。然而,从 Python 3.8 开始,它被纳入标准库。

try:
from typing import TypedDict # >=3.8
except ImportError:
from mypy_extensions import TypedDict # <=3.7

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

基于类的类型构造器 is also available :

class Movie(TypedDict):
name: str
year: int

尽管存在差异,NamedTupleTypedDict 都锁定了要使用的特定键,以及每个键对应的值的类型。因此,它们的目标基本相同:为复合/结构类型提供有用的类型化机制。

Python 的标准 typing.Dict 侧重于更同质的并行映射,定义键/值类型,而不是键本身。因此,它在定义恰好存储在字典中的复合对象时不是很有用。

ConnectionOptions = Dict[str, str] 

关于python - Python/mypy 中 NamedTuple 和 TypedDict 的主要区别是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53409117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com