Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 增强提案

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}"

以下附加限制仅适用于字节字面量(带有 bBstringprefix 中的 stringliteral 令牌)

  • 每个 shortstringcharlongstringchar 必须是介于 1 到 127 之间的字符,无论源文件中的任何编码声明 [2]
  • Python 2.x 中不识别 Unicode 特定的转义序列 \uxxxx\Uxxxxxxxx\N{name},并在 Python 3000 中禁止使用。

相邻的字节字面量遵循与相邻字符串字面量相同的连接规则 [3]。字节字面量与字符串字面量相邻是错误的。

语义

每次评估字节字面量都会生成一个新的 bytes 对象。新对象中的字节是由字面量的 shortstringitemlongstringitem 部分表示的字节,按相同的顺序排列。

理由

建议的语法为大多数涉及 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