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

上次修改时间:2023-09-09 17:39:29 GMT