为什么没有 character/codepoint 字符串等同于 `collections.abc.ByteString`?

Why no character/codepoint string equivalant of `collections.abc.ByteString`?

Python 的 collections.abc 模块提供 SequenceMutableSequence 抽象基础 类 (ABC),这些涵盖¹ strbytesbytearray 和预期的类似类型。

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


¹ 'Cover' 子类型是 isinstance() ABC。

添加

ByteString 是为了让您可以测试出现在 3.x 文档中的 "bytes-like type" 而无需编写 (bytes, bytearray).

事实上,它的文档字符串只是 "This unifies bytes and bytearray."

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

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

Add ABC ByteString which unifies bytes and bytearray (but not memoryview).

There's no ABC for "PEP 3118 style buffer API objects" because there's no way to recognize these in Python (apart from trying to use memoryview() on them).

Note that array.array really should be registered as a MutableSequence but that would require importing it whenever collections is imported.

2007 年 11 月 21 日附近的 b.p.o. or the python-dev or maybe python-ideas 邮件列表档案可能会有进一步的讨论,如果你真的想深入挖掘的话。但我怀疑那里有更多的兴趣,因为这里真的没什么可讨论的。


注意 typing actually does have a type for this, Text,记录为:

Text is an alias for str. It is provided to supply a forward compatible path for Python 2 code: in Python 2, Text is an alias for unicode.

Use Text to indicate that a value must contain a unicode string in a manner that is compatible with both Python 2 and Python 3:

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

在运行时,如果你想要这个,你几乎肯定想要实际的 strunicode 构造函数,所以你会使用像 six.text_type.

这样的东西