为什么 str 不是 collections.abc.ByteString 的子类?
Why is str not a subclass of collections.abc.ByteString?
查看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,我认为这些差异与抽象基础 class collections.abc.ByteString
的关系不应该相关。但是,bytes
被视为子 class 而 str
不是:
>>> issubclass(bytes, collections.abc.ByteString)
True
>>> issubclass(str, collections.abc.ByteString)
False
虽然观察到的行为有助于辨别这些类型,但我不明白为什么 Python 会这样。在我对Python的duck typing概念的理解中,str
和bytes
只要带上相关的属性,都应该算是子class。
A str
不是字节串。 ByteString
的含义不在其方法中,str
不符合ByteString
的含义。 (ABC 主要作为捆绑 bytes
和 bytearray
进行 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 register
ed 作为子类实现。
从实用的角度来看,str
和 bytes
不能相互替代,因此将它们作为比 [=12= 更具体的子类没有任何用处] 或 Hashable
或 Sized
...
如果您想互换使用它们,则程序中可能存在错误。
查看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,我认为这些差异与抽象基础 class collections.abc.ByteString
的关系不应该相关。但是,bytes
被视为子 class 而 str
不是:
>>> issubclass(bytes, collections.abc.ByteString)
True
>>> issubclass(str, collections.abc.ByteString)
False
虽然观察到的行为有助于辨别这些类型,但我不明白为什么 Python 会这样。在我对Python的duck typing概念的理解中,str
和bytes
只要带上相关的属性,都应该算是子class。
A str
不是字节串。 ByteString
的含义不在其方法中,str
不符合ByteString
的含义。 (ABC 主要作为捆绑 bytes
和 bytearray
进行 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 register
ed 作为子类实现。
从实用的角度来看,str
和 bytes
不能相互替代,因此将它们作为比 [=12= 更具体的子类没有任何用处] 或 Hashable
或 Sized
...
如果您想互换使用它们,则程序中可能存在错误。