PEP 3112 – Python 3000 中的字节字面量
- 作者:
- Jason Orendorff <jason.orendorff at gmail.com>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 要求:
- 358
- 创建时间:
- 2007 年 2 月 23 日
- Python 版本:
- 3.0
- 发布历史:
- 2007 年 2 月 23 日
摘要
本 PEP 提出了一种针对 PEP 358 中引入的 bytes
对象的字面量语法。目的是提供一种方便的方式来拼写 ASCII 字符串和任意二进制数据。
动机
Python 3000 中现有 ASCII 字符串的拼写方式包括
bytes('Hello world', 'ascii')
'Hello world'.encode('ascii')
建议的语法是
b'Hello world'
Python 3000 中现有 8 位二进制序列的拼写方式包括
bytes([0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00])
bytes('\x7fELF\x01\x01\x01\0', 'latin-1')
'7f454c4601010100'.decode('hex')
建议的语法是
b'\x7f\x45\x4c\x46\x01\x01\x01\x00'
b'\x7fELF\x01\x01\x01\0'
在这两种情况下,新语法的优势在于简洁、效率略微提高,以及在编译时而不是在运行时检测编码错误。当使用字节对象的字符串类方法时,简洁的好处尤其明显
lines = bdata.split(bytes('\n', 'ascii')) # existing syntax
lines = bdata.split(b'\n') # proposed syntax
以及在将代码从 Python 2.x 转换为 Python 3000 时
sok.send('EXIT\r\n') # Python 2.x
sok.send('EXIT\r\n'.encode('ascii')) # Python 3000 existing
sok.send(b'EXIT\r\n') # proposed
语法更改
建议的语法是现有字符串语法的扩展 [1]。
字符串的新语法,包括新的字节字面量,是
stringliteral: [stringprefix] (shortstring | longstring)
stringprefix: "b" | "r" | "br" | "B" | "R" | "BR" | "Br" | "bR"
shortstring: "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring: "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem: shortstringchar | escapeseq
longstringitem: longstringchar | escapeseq
shortstringchar:
<any source character except "\" or newline or the quote>
longstringchar: <any source character except "\">
escapeseq: "\" NL
| "\\" | "\'" | '\"'
| "\a" | "\b" | "\f" | "\n" | "\r" | "\t" | "\v"
| "\ooo" | "\xhh"
| "\uxxxx" | "\Uxxxxxxxx" | "\N{name}"
以下附加限制仅适用于字节字面量(带有 b
或 B
的 stringprefix
中的 stringliteral
令牌)
- 每个
shortstringchar
或longstringchar
必须是介于 1 到 127 之间的字符,无论源文件中的任何编码声明 [2]。 - Python 2.x 中不识别 Unicode 特定的转义序列
\u
xxxx、\U
xxxxxxxx 和\N{
name}
,并在 Python 3000 中禁止使用。
相邻的字节字面量遵循与相邻字符串字面量相同的连接规则 [3]。字节字面量与字符串字面量相邻是错误的。
语义
每次评估字节字面量都会生成一个新的 bytes
对象。新对象中的字节是由字面量的 shortstringitem
或 longstringitem
部分表示的字节,按相同的顺序排列。
理由
建议的语法为大多数涉及 8 位字符串的代码提供了从 Python 2.x 到 Python 3000 的更清晰的迁移路径。保留字符串字面量的旧 8 位含义通常只需添加一个 b
前缀即可。唯一的例外是包含大于 127 的字节的 Python 2.x 字符串,必须使用转义序列重新编写。将源文件从一种编码转换为另一种编码,并修正编码声明,应该保留程序的含义。Python 2.x 非 Unicode 字符串违反了这一原则;Python 3000 字节字面量不应该违反。
在 Python 2.5 中,带有 b
前缀的字符串字面量始终是语法错误,因此此语法可以在 Python 2.6 中引入,同时引入 bytes
类型。
字节字面量每次评估都会产生一个新对象,就像列表显示一样,与字符串字面量不同。这是必要的,因为字节字面量与列表一样是可变的,与字符串不同 [4]。
参考实现
Thomas Wouters 已将实现检查到 Py3K 分支,r53872。
参考资料
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3112.rst
最后修改时间:2023 年 9 月 9 日 17:39:29 GMT