查看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'}
通过检查Python documentation,我发现这些差异与抽象基类collections.abc.ByteString
的关系无关。但是,bytes
被视为一个子类,而str
不是:
>>> issubclass(bytes, collections.abc.ByteString)
True
>>> issubclass(str, collections.abc.ByteString)
False
虽然观察到的行为有助于识别这些类型,但我不理解Python为什么会这样做。在我对Python的duck类型概念的理解中,str
和bytes
都应该被视为子类,只要它们带来了相关的属性
{}不是一个字节字符串
ByteString
的含义不包含在其方法中,并且str
不符合ByteString
的含义。(ABC主要作为捆绑bytes
和bytearray
进行isinstance
检查的一种方式存在,因此在其docstring中有“This unified bytes and bytearray.”您可能会想,为什么{{CD8}}不会根据其方法自动地考虑^ {< CD1>} ^ ^ {CD2>}子类。除非ABC专门实现^{} 来检查方法,否则^ {< CD8}}不会基于任何特定方法的存在自动考虑ABC的类A子类。{}和} 归类为子类
bytearray
是ByteString
的子类,因为它们被特别地^{从实用的角度来看,
str
和bytes
不能相互替代,因此将它们作为比Iterable
或Hashable
或Sized
更具体的子类是没有任何用处的如果您想互换使用它们,那么程序中可能有一个bug
相关问题 更多 >
编程相关推荐