`isinstance()` 应该检查输入还是 collections.abc?
Should `isinstance()` check against typing or collections.abc?
typing
和collections.abc
都包含类似的类型,例如Mapping
、Sequence
等
根据 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
也有效,我不想从 typing
和 collections.abc
中导入 Mapping
。那么将 typing
与 isinstance()
一起使用有什么问题吗?
没有收获。 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 几年到来吧,不过。
typing
和collections.abc
都包含类似的类型,例如Mapping
、Sequence
等
根据 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
也有效,我不想从 typing
和 collections.abc
中导入 Mapping
。那么将 typing
与 isinstance()
一起使用有什么问题吗?
没有收获。 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 几年到来吧,不过。