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

Python 增强提案

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,带_分隔符。

对于bxo格式说明符,将允许使用_并按4位数字分组。

先行实践

那些允许下划线分组的语言对下划线的允许放置规则有很大的不同。在语言规范与实际行为相矛盾的情况下,列出实际行为。(“单一”或“多个”指是否允许连续的下划线。)

  • Ada:单一,仅在数字之间[8]
  • C# (7.0的开放提案):多个,仅在数字之间[6]
  • C++14:单一,在数字之间(选择了不同的分隔符)[1]
  • D:多个,任何地方,包括末尾[2]
  • Java:多个,仅在数字之间[7]
  • Julia:单一,仅在数字之间(但不在浮点指数部分)[9]
  • Perl 5:多个,基本上任何地方,尽管文档说它限制在一个下划线在数字之间[3]
  • Ruby:单一,仅在数字之间(尽管文档说“任何地方”)[10]
  • Rust:多个,任何地方,除了指数“e”和数字之间[4]
  • Swift:多个,在数字之间和末尾(尽管文本描述只说“在数字之间”)[5]

替代语法

下划线放置规则

除了上述相对严格的规则外,下划线的使用可以不那么受限。正如在其他语言中看到的,常见规则包括:

  • 只允许一个连续的下划线,且仅在数字之间。
  • 允许多个连续的下划线,但仅在数字之间。
  • 允许多个连续的下划线,在大多数位置,除了字面量的开头,或像小数点后等特殊位置。

本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