`isinstance()` 应该检查输入还是 collections.abc?

Should `isinstance()` check against typing or collections.abc?

typingcollections.abc都包含类似的类型,例如MappingSequence

根据 python 文档,collections.abc 似乎更适合类型检查:

This module provides abstract base classes that can be used to test whether a class provides a particular interface; for example, whether it is hashable or whether it is a mapping. https://docs.python.org/3/library/collections.abc.html

但使用 typing 也有效,我不想从 typingcollections.abc 中导入 Mapping。那么将 typingisinstance() 一起使用有什么问题吗?

没有收获。 typing 库使用 collections 库中的存根。您完全可以将 isinstance 与类型库一起使用,当然是针对您提到的类型(映射和序列)。

许多 typing 泛型 class 只是 abc 的别名。正如文档中的示例,Hashable:

class typing.Hashable

An alias to collections.abc.Hashable

此外,

isinstance(abc.Hashable, typing.Hashable)
isinstance(typing.Hashable, abc.Hashable)

都是 True,清楚地表明它们在 class 层次结构方面是等价的。在 Python 中,您可以使用来源字段检查别名的来源:

>>> typing.Hashable.__origin__
<class 'collections.abc.Hashable'>

如果您不需要,我没理由导入 abc。这两个包提供了相似但不同的用途,因此我将只导入您需要的内容。这更像是一种意见,但如果你的用例只是检查 isinstance (即没有有趣的参数注释),两者对我来说似乎都是等价的,尽管 abc 可能是更常用的工具。

从python 3.9 开始,collections.abc 模块中的整套collections.abc 别名从typing 模块is deprecated, meaning that your preferred option for python >=3.9 should be to use the versions in the collections.abc module. The classes will not be removed 几年到来吧,不过。