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}"
以下附加限制仅适用于字节字面量(在stringprefix
中带有b
或B
的stringliteral
标记)
- 每个
shortstringchar
或longstringchar
必须是介于1到127之间的字符(含),无论源文件中是否存在任何编码声明[2]。 - Unicode专用转义序列
\u
xxxx、\U
xxxxxxxx和\N{
name}
在Python 2.x中不被识别,在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
上次修改: 2025-02-01 08:59:27 GMT