f 字符串中的空格导致 ValueError:格式说明符无效

Ste*_*ler 4 python python-3.x f-string

我和一位同事刚刚使用 f 字符串偶然发现了一个有趣的问题。这是一个最小的例子:

>>> f"{ 42:x}"
'2a'
Run Code Online (Sandbox Code Playgroud)

在十六进制类型后面写入空格会导致ValueError

>>> f"{ 42:x }"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
Run Code Online (Sandbox Code Playgroud)

我理解PEP 498 中忽略表达式中的前导和尾随空白段落意味着该空格实际上应该被忽略。

为什么空格字符会导致错误,其背后的原因是什么?

Bha*_*rel 7

根据您分享的链接:

为了便于阅读,表达式中的前导和尾随空格将被忽略。这是在求值之前将表达式括在括号中的副产品。

表达式是冒号 ( ) 之前的所有内容[1]:,而格式说明符是冒号之后的所有内容。

{ 42 : x }在 an 内部f-string相当于( 42 )带有格式说明符" x ".

( 42 ) == 42但是" x " != "x",格式说明符被完整地传递给对象__format__

当对象尝试格式化时,它无法识别这些位置中空格 ( ) 的含义" ",并引发错误。

此外,在某些格式说明符上,空格实际上具有含义,例如作为填充字符或作为符号选项

>>> f"{42: >+5}"  # Width of 5, align to right, with space as fill and plus or minus as sign
'  +42'
>>> f"{42:#> 5}"  # Width of 5, align to right, with `#` as fill and space or minus as sign.
'## 42'
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅格式规范迷你语言


1不包括类型转换,例如!s,!r!a