Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

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

以下附加限制仅适用于字节字面量(在stringprefix中带有bBstringliteral标记)

  • 每个shortstringcharlongstringchar必须是介于1到127之间的字符(含),无论源文件中是否存在任何编码声明[2]
  • Unicode专用转义序列\uxxxx\Uxxxxxxxx\N{name}在Python 2.x中不被识别,在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

上次修改: 2025-02-01 08:59:27 GMT