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'>