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

2024-06-17 09:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

查看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的duck类型概念的理解中,strbytes都应该被视为子类,只要它们带来了相关的属性


Tags: format类型bytesdir子类collectionsabcdecode
2条回答

{}不是一个字节字符串ByteString的含义不包含在其方法中,并且str不符合ByteString的含义。(ABC主要作为捆绑bytesbytearray进行isinstance检查的一种方式存在,因此在其docstring中有“This unified bytes and bytearray.”

您可能会想,为什么{{CD8}}不会根据其方法自动地考虑^ {< CD1>} ^ ^ {CD2>}子类。除非ABC专门实现^{}来检查方法,否则^ {< CD8}}不会基于任何特定方法的存在自动考虑ABC的类A子类。{}和bytearrayByteString的子类,因为它们被特别地^{}归类为子类

从实用的角度来看,strbytes不能相互替代,因此将它们作为比IterableHashableSized更具体的子类是没有任何用处的

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

相关问题 更多 >