【问题标题】:Why is str not a subclass of collections.abc.ByteString?为什么 str 不是 collections.abc.ByteString 的子类?
【发布时间】:2020-08-26 09:56:43
【问题描述】:

查看 Python 中的 strbytes 类型时,发现它们非常相似。唯一的区别是。它们的属性是:

>>> set(dir(bytes)) - set(dir(str))
{'hex', 'fromhex', 'decode'}
>>> set(dir(str)) - set(dir(bytes))
{'isidentifier', 'encode', 'isdecimal', 'isnumeric', 'casefold', 'format', 'isprintable', 'format_map'}

检查Python documentation,我认为这些差异与它们与抽象基类collections.abc.ByteString 的关系无关。但是,bytes 被视为子类,而 str 不是:

>>> issubclass(bytes, collections.abc.ByteString)
True
>>> issubclass(str, collections.abc.ByteString)
False

虽然观察到的行为对于辨别这些类型很有用,但我不明白 Python 为什么会这样。在我对 Python 的鸭子类型概念的理解中,strbytes 都应该被视为子类,只要它们带有相关的属性即可。

【问题讨论】:

    标签: python abstract-class abc


    【解决方案1】:

    str 不是字节串。 ByteString 的含义不包含在其方法中,str 不符合 ByteString 的含义。 (ABC 主要是作为一种捆绑bytesbytearray 以进行isinstance 检查的方式存在,因此在其文档字符串中出现“这将字节和字节数组统一起来。”)

    您可能想知道为什么issubclass 不会根据其方法自动将str 视为ByteString 子类。除非 ABC 专门实现 __subclasshook__ 来检查方法,否则 issubclass 不会根据任何特定方法的存在自动将类视为 ABC 的子类。 bytesbytearrayByteString 的子类,因为它们专门作为子类 registered。

    【讨论】:

    • 刚刚查看了_collections_abc.py 来源:虽然许多(更简单的)ABC 实现__subclasshook__ 来检查现有方法,但ByteString 没有而且只注册bytes 和@ 987654343@.
    【解决方案2】:

    从实际的角度来看,strbytes 不能相互替代,因此将它们作为比 IterableHashable 或 @987654325 更具体的任何东西的子类没有任何用处@...

    如果您想互换使用它们,则程序中可能存在错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多