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

Python 为什么str不是collections.abc.ByteString的子类?,python,abstract-class,abc,Python,Abstract Class,Abc,查看Python中的类型str和bytes,发现它们非常相似。唯一的区别在于。它们的特点是: >>> set(dir(bytes)) - set(dir(str)) {'hex', 'fromhex', 'decode'} >>> set(dir(str)) - set(dir(bytes)) {'isidentifier', 'encode', 'isdecimal', 'isnumeric', 'casefold', 'format', 'isprinta

查看Python中的类型
str
bytes
,发现它们非常相似。唯一的区别在于。它们的特点是:

>>> set(dir(bytes)) - set(dir(str))
{'hex', 'fromhex', 'decode'}
>>> set(dir(str)) - set(dir(bytes))
{'isidentifier', 'encode', 'isdecimal', 'isnumeric', 'casefold', 'format', 'isprintable', 'format_map'}
通过检查,我发现这些差异与抽象基类
collections.abc.ByteString
的关系不相关。但是,
bytes
被视为一个子类,而
str
则不是:

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

虽然观察到的行为有助于识别这些类型,但我不理解Python为什么会这样做。在我对Python的duck类型概念的理解中,
str
bytes
都应该被视为子类,只要它们带有相关属性。

A
str
不是一个字节字符串
ByteString
的含义不包含在其方法中,
str
不符合
ByteString
的含义。(ABC主要作为捆绑
字节
字节数组
的方式存在,用于
isinstance
检查,因此在其docstring中使用“This unified bytes and bytearray.”


您可能会想,为什么代码>子类< /CODE>不会根据其方法自动考虑<代码> STR <代码> A<代码> ByTeScord< /Cord>子类。除非ABC专门实现检查方法,否则,代码> ISSub类< /C>不会根据任何特定方法的存在自动考虑ABC的A类子类。code>bytes和
bytearray
ByteString
的子类,因为它们被专门定义为子类。

A
str
不是一个字节字符串
ByteString
的含义不包含在其方法中,
str
不符合
ByteString
的含义。(ABC主要作为捆绑
字节
字节数组
的方式存在,用于
isinstance
检查,因此在其docstring中使用“This unified bytes and bytearray.”


您可能会想,为什么代码>子类< /CODE>不会根据其方法自动考虑<代码> STR <代码> A<代码> ByTeScord< /Cord>子类。除非ABC专门实现检查方法,否则,代码> ISSub类< /C>不会根据任何特定方法的存在自动考虑ABC的A类子类。code>bytes和
bytearray
ByteString
的子类,因为它们被专门定义为子类。

从实用角度来看,
str
bytes
不能相互替代,因此,让它们成为比
Iterable
Hashable
size
更具体的子类没有任何用处


如果您想互换使用它们,程序中可能有一个bug。

从实际角度来看,
str
字节
不能相互替代,因此,让它们成为比
Iterable
Hashable
size
更具体的子类没有任何用处


如果您想互换使用它们,程序中可能有一个bug。

刚刚查看了
\u collections\u abc.py
源代码:虽然许多(更简单的)abc实现
\u subclasshook\uu
以检查现有方法,
ByteString
不仅注册
bytes
bytearray
。只看了一下
\u集合\u abc.py
源代码:虽然许多(更简单的)abc实现了
\u子类hook\uuu
来检查现有的方法,
ByteString
不注册且仅注册
bytes
bytearray