2

是否存在断言失败的 Python 实现:

assert all(byte in range(256) for byte in any_bytes_object) # Python 3 semantics 
assert all(byte in range(256) for byte in map(ord, any_bytes_object)) # Python 2

POSIX 明确指定CHAR_BIT == 8(8 bits per byte)。Python中有类似的保证吗?它是否记录在某处?

Python 2 参考说:“字符代表(至少)8 位字节。”

如果bytes未定义名称(在旧的 Python 版本上),例如在 Jython 2.5 上,那么问题是关于str类型(字节串),即bytes = str在 Python 2 上。

4

3 回答 3

5

字节对象Python 3 文档

bytes 对象实际上表现得像不可变的整数序列,序列中的每个值都受到限制,使得 0 <= x < 256

并且该bytearray类型在Python 3Python 2中都记录为

0 <= x < 256 范围内的可变整数序列

因此该语言是在 8 位字节的假设下设计的。


与 Python 3 文档相比,Python 2 数据模型部分说“至少”8 位似乎只是 Python 2 文档没有很好地保持最新的地方之一。它至少可以追溯到Python 1.4,早在他们不确定是否要支持奇怪的字节大小的早期。

至少自从 2.0 版本中引入了 unicode 支持以来,文档中到处都是将 bytestring 类型称为“8 位字符串”的地方。Python 没有像 C 那样严格指定,但我想说 Python 2.0 或更高版本的任何“一致”实现都必须有 8 位字节。

于 2016-03-28T15:47:12.543 回答
1

除了user2357112 引用的官方文档外,我们还可以参考引入字节对象的 Python 增强提案。

PEP 358——指定的“字节”对象:

一个字节对象存储一个可变的整数序列,范围在 0 到 255 之间。

我们知道字节对象最终是不可变的,这个规范不能完全适用,它的“范围”部分也可能没有实际意义。

有趣的是,PEP 3137 - Immutable Bytes and Mutable Buffer部分取代了 PEP 358(并将字节指定为不可变并将字节数组作为可变等效项引入)仅指定您可以放入字节对象和字节数组中的内容(“int[eger]s在范围内(256)”),但不是它们可能产生的结果

PEP 根本没有提到“位”或“位”。(虽然我们从按位布尔运算中知道 Python 整数如何映射到位模式,但我希望那里不应该有任何意外。)

于 2016-03-28T16:08:02.427 回答
1

蟒蛇 3

从 Python 3.0 开始,Python 语言参考指定:

字节对象是一个不可变数组。这些项目是 8 位字节,由 0 <= x < 256 范围内的整数表示。

蟒蛇2

在此之前(即,直到 Python 2.7),它指定(如问题中已经提到的):

字符串的项目是字符。[…] 字符代表(至少) 8 位字节。

(强调补充。)

请注意,Python 2 没有bytes对象。为了在 Python 2 中保存不可变的字节块二进制数据序列,通常使用字符串。(相比之下,Python 3 字符串仅用于文本数据,与 Python 2 的unicode对象相比,它更等同于 Python 2 的字符串。)

但 ...

ord()该函数的 Python 2 文档提到“8 位字符串”并将它们与 unicode 对象进行对比。可能暗示所有非 unicode Python-2 字符串都是 8 位字符串,但我不会指望这一点。

结论

提供符合 Python-3 的bytes对象的 Python 实现将被限制为仅在其中保存 8 位字节。符合 Python 2 的 Python 实现不会受此约束(作为一个bytes对象,如果它具有一个,则未指定),如果您使用其符合 Python-2 的字符串作为替代,则不会有任何保证最大字节大小(实际上是字符大小),除非实现说明了它自己的一些保证。

于 2016-03-28T17:57:16.817 回答