PEP 515 – 数字字面量中的下划线
- 作者:
- Georg Brandl, Serhiy Storchaka
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2016年2月10日
- Python 版本:
- 3.6
- 发布历史:
- 2016年2月10日, 2016年2月11日
摘要与理由
本PEP提议扩展Python的语法和数字字符串构造函数,以便在整数、浮点数和复数字面量中使用下划线作为数字分组的可视化分隔符。
这是其他现代语言的常见特性,可以提高长字面量或其值应清晰地分为几部分的字面量(例如十六进制表示法中的字节或字)的可读性。
示例
# grouping decimal numbers by thousands
amount = 10_000_000.0
# grouping hexadecimal addresses by words
addr = 0xCAFE_F00D
# grouping bits into nibbles in a binary literal
flags = 0b_0011_1111_0100_1110
# same, for string conversions
flags = int('0b_1111_0000', 2)
规范
当前的提议是允许在数字字面量中,在数字之间以及在基数说明符之后使用一个下划线。下划线没有语义意义,字面量将被解析为下划线不存在的情况。
字面量语法
因此,整数型字面量的产生式列表将如下所示:
integer: decinteger | bininteger | octinteger | hexinteger
decinteger: nonzerodigit (["_"] digit)* | "0" (["_"] "0")*
bininteger: "0" ("b" | "B") (["_"] bindigit)+
octinteger: "0" ("o" | "O") (["_"] octdigit)+
hexinteger: "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit: "1"..."9"
digit: "0"..."9"
bindigit: "0" | "1"
octdigit: "0"..."7"
hexdigit: digit | "a"..."f" | "A"..."F"
对于浮点型和复数型字面量
floatnumber: pointfloat | exponentfloat
pointfloat: [digitpart] fraction | digitpart "."
exponentfloat: (digitpart | pointfloat) exponent
digitpart: digit (["_"] digit)*
fraction: "." digitpart
exponent: ("e" | "E") ["+" | "-"] digitpart
imagnumber: (floatnumber | digitpart) ("j" | "J")
构造函数
遵循相同的放置规则,下划线将被允许用于以下构造函数:
int()(带任意基数)float()complex()Decimal()
进一步的更改
新的数字-字符串格式化语言将被扩展,允许使用_作为千位分隔符,目前只支持,。这可以轻松生成具有更高可读性字面量的代码。[11]
语法将与逗号相同,例如,{:10_}表示宽度为10,带_分隔符。
对于b、x和o格式说明符,将允许使用_并按4位数字分组。
先行实践
那些允许下划线分组的语言对下划线的允许放置规则有很大的不同。在语言规范与实际行为相矛盾的情况下,列出实际行为。(“单一”或“多个”指是否允许连续的下划线。)
替代语法
下划线放置规则
除了上述相对严格的规则外,下划线的使用可以不那么受限。正如在其他语言中看到的,常见规则包括:
- 只允许一个连续的下划线,且仅在数字之间。
- 允许多个连续的下划线,但仅在数字之间。
- 允许多个连续的下划线,在大多数位置,除了字面量的开头,或像小数点后等特殊位置。
本PEP中的语法最终被选中,因为它涵盖了常见的用例,并且不允许使用风格指南无论如何都必须避免的语法。
一个不那么常见的规则是只允许每N个数字使用下划线(N对于十进制字面量可以是3,对于十六进制字面量可以是4)。这是不必要的限制,尤其是考虑到在不同文化中分隔符的位置是不同的。
不同的分隔符
曾提出的替代语法是使用空格进行分组。尽管字符串是结合相邻字面量的先例,但这种行为可能导致与下划线不一样的意外效果。此外,除了那些通常忽略任何空格的语言外,没有其他语言已知使用此规则。
C++14引入了撇号进行分组(因为下划线会与用户定义的字面量产生歧义),但由于Python字符串字面量中的使用,未予考虑。[1]
实施
一个实现上述规范的初步补丁已发布到问题跟踪器。[12]
参考资料
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0515.rst
最后修改: 2025-02-01 08:59:27 GMT