Python 'isinstance()`是否应检查键入或collections.abc?

Python 'isinstance()`是否应检查键入或collections.abc?,python,isinstance,Python,Isinstance,键入和集合。abc包括类似的类型,如映射,序列等 根据python文档,类型检查似乎首选collections.abc: 该模块提供抽象基类,可用于测试类是否提供特定接口;例如,它是可散列的还是映射的。 但是使用键入也很有效,我不希望同时从键入和集合导入映射。因此,使用键入和isinstance()是否有任何缺陷?没有缺陷。键入库使用集合库中的存根。您完全可以在类型库中使用isinstance,当然是针对您提到的类型(映射和序列)。许多类型泛型类只是abc类的别名。正如文档中的一个示例所示:

键入
集合。abc
包括类似的类型,如
映射
序列

根据python文档,类型检查似乎首选
collections.abc

该模块提供抽象基类,可用于测试类是否提供特定接口;例如,它是可散列的还是映射的。


但是使用
键入
也很有效,我不希望同时从
键入
集合导入
映射
。因此,使用
键入
isinstance()
是否有任何缺陷?

没有缺陷。
键入
库使用
集合
库中的存根。您完全可以在类型库中使用
isinstance
,当然是针对您提到的类型(映射和序列)。

许多
类型
泛型类只是
abc
类的别名。正如文档中的一个示例所示:

类类型。可散列

collections.abc.Hashable的别名

而且

两者都是真的,这表明它们在类层次结构方面是等价的。在Python中,可以使用“原点”字段检查别名的原点:

>>> typing.Hashable.__origin__
<class 'collections.abc.Hashable'>
>>键入.可散列.\uuu来源__
如果您不需要,我没有理由导入
abc
。这两个包提供了相近但不同的用途,因此我只导入您需要的内容。这更像是一种观点,但如果您的用例只是针对
isinstance
(即没有有趣的参数注释)进行检查,那么这两种方法对我来说似乎都是等效的,尽管
abc
可能是更常用的工具

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