为什么 str 不是 collections.abc.ByteString 的子类?

Why is str not a subclass of collections.abc.ByteString?

查看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,我认为这些差异与抽象基础 class collections.abc.ByteString 的关系不应该相关。但是,bytes 被视为子 class 而 str 不是:

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

虽然观察到的行为有助于辨别这些类型,但我不明白为什么 Python 会这样。在我对Python的duck typing概念的理解中,strbytes只要带上相关的属性,都应该算是子class。

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

您可能想知道为什么 issubclass 不会根据其方法自动将 str 视为 ByteString 子类。除非 ABC 专门将 __subclasshook__ to check for methods, issubclass will not automatically consider a class a subclass of an ABC based on the presence of any particular methods. bytes and bytearray are subclasses of ByteString because they are specifically registered 作为子类实现。

从实用的角度来看,strbytes 不能相互替代,因此将它们作为比 [=12= 更具体的子类没有任何用处] 或 HashableSized...

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