【问题标题】:Should `isinstance()` check against typing or collections.abc?`isinstance()` 是否应该检查类型或 collections.abc?
【发布时间】:2020-06-24 04:48:38
【问题描述】:

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

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

这个模块提供了抽象基类,可以用来测试一个类是否提供了特定的接口;例如,它是可散列的还是映射的。 https://docs.python.org/3/library/collections.abc.html

但是使用typing 也可以,我不想从typingcollections.abc 导入Mapping。那么使用typingisinstance() 有什么问题吗?

【问题讨论】:

    标签: python isinstance


    【解决方案1】:

    没有问题。 typing 库使用来自 collections 库的存根。您完全可以将isinstance 与打字库一起使用,当然对于您提到的类型(映射和序列)。

    【讨论】:

      【解决方案2】:

      许多typing 泛型类只是abc 的别名。就像文档中的一个例子一样,Hashable:

      class typing.Hashable

      collections.abc.Hashable 的别名

      还有,

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

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

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

      如果您不需要它,我看不到导入 abc 的理由。这两个包提供了接近但不同的用途,所以我只会导入你需要的东西。这更像是一种观点,但如果您的用例仅检查 isinstance(即没有有趣的参数注释),两者似乎都与我等价,尽管 abc 可能是更常用的工具。

      【讨论】:

        【解决方案3】:

        从 python 3.9 开始,collections.abc 的整套别名在 typing 模块 is deprecated 中,这意味着您对 python >=3.9 的首选选项应该是使用 collections.abc 模块中的版本。不过,typing 模块中的 will not be removed 类将在未来几年内使用。

        【讨论】:

          猜你喜欢
          • 2021-10-22
          • 2023-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-10
          • 2017-10-10
          • 2019-04-26
          • 2013-01-18
          相关资源
          最近更新 更多