为什么没有任何字符/代码点字符串等效于`collections.abc.ByteString`?

时间:2018-07-17 03:26:58

标签: python arrays abc

Python的collections.abc模块提供了SequenceMutableSequence抽象基类(ABC),它们涵盖了strbytesbytearray和与预期的相似。

collections.abc还提供了ByteString ABC,它涵盖了bytesbytearray和大概相似的类型。但是对于字符串或代码点(例如str),它不提供ABC。 (这样的ABC可能命名为StringCharStringCodepointString。)为什么提供前者而不是后者? (换句话说,需要用例但不需要用例的预期用例是什么?)


¹'Cover',例如,子类型为isinstance() ABC。

1 个答案:

答案 0 :(得分:3)

添加了

ByteString,使您无需编写(bytes, bytearray)就可以测试出现在3.x文档中的“类似字节的类型”。

事实上,它的文档字符串只是“这统一了字节和字节数组”。

对Unicode字符串没有类似的需求,因为str是唯一的这种类型;没有什么可以统一的。

您可以单击文档顶部的源链接,找到ByteString,然后直接从GitHub GUI git blame找到the commit that added it。签到评论为:

  

添加ABC ByteString,它将字节和字节数组(而不是memoryview)统一起来。

     

“ PEP 3118样式缓冲区API对象”没有ABC,因为没有   在Python中识别这些内容的方法(除了尝试使用memoryview()   在他们身上。)

     

请注意,array.array实际上应该注册为MutableSequence   但这需要在导入集合时将其导入。

2007年11月21日前后,如果您真的想更深入地研究,可能会在b.p.o.python-devpython-ideas邮件列表档案中进行进一步的讨论。但是我怀疑那里是否有更多的兴趣,因为在这里实际上没有太多讨论。


请注意,typing实际上是 的类型,Text,记录为:

  

Textstr的别名。提供它是为了为Python 2代码提供前向兼容的路径:在Python 2中,文本是unicode的别名。

     

使用Text表示值必须包含与python 2和python 3兼容的unicode字符串。

正如文档所表明的那样,这并不是为了统一同一语言中的多个Unicode字符串类型而添加的,而是为了在静态类型检查时统一Python 2 unicode和Python 3 str

在运行时,如果需要,几乎可以肯定需要实际的strunicode构造函数,因此可以使用类似six.text_type的东西。