Python类型提示:打字,映射与打字,字典

sta*_*cks 11 python type-hinting python-3.x

我正在处理一个python3项目,我们在其中typing始终使用模块类型提示。

看来,我们使用typing.Dicttyping.Mapping几乎可以互换。

是否有理由偏爱一个?

sta*_*cks 13

自己回答了这个问题。

typing.Dict应该用来表示dict支持元素类型提示的文字类型,即Dict[bytes, str]

typing.Mapping是定义__getitem__,__len__,__iter__魔术方法的对象

typing.MutableMapping是一个定义与“映射”相同的对象,但也具有__setitem__,__delitem__魔术方法。

映射等。基于此表中的abc类型

  • 还有一处区别。`Dict` 是不变的,`Mapping` 是协变的。例如,当您有一个函数接收 `Dict[A,B]` 并尝试传递 `Dict[A,C]` 时,这一点很重要,其中 `C` 是 `B` 的子类型。您将遇到输入错误,可以通过使用“Mapping[A,B]”来避免,请参阅https://realpython.com/python-type-checking/#covariant-contravariant-and-invariant。 (13认同)
  • 经验法则:期望泛型,返回特定类型。这为您的功能和类别的用户提供了最大的灵活性和安全性。 (5认同)
  • @hubatish Mapping 更通用,因为有比 `Dict` 更多的类实现了 `Mapping` 代表的 3 个神奇方法。 (2认同)
  • 我相信“映射”只是其值的协变,而不是关键。 (2认同)

los*_*ens 12

正如官方 python (3.11) 文档 所建议的,typing.Dict对于注释返回类型很有用。要注释参数,最好使用抽象集合类型,例如Mapping.

此外,typing.Dict自 3.9 版本以来已被弃用。有利于dict