Space in f-string leads to ValueError: Invalid format specifier

Space in f-string leads to ValueError: Invalid format specifier

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

>>> f"{ 42:x}"
'2a'

在十六进制类型后写一个space导致一个ValueError:

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

我理解段落 Leading and trailing whitespace in expressions is ignored in PEP 498 的意思是 space 实际上应该被忽略。

为什么 space 字符会导致错误,这背后的原因是什么?

根据您分享的link:

For ease of readability, leading and trailing whitespace in expressions is ignored. This is a by-product of enclosing the expression in parentheses before evaluation.

表达式是冒号 (:) 之前的一切[1],而格式说明符是冒号之后的一切。

{ 42 : x }f-string 中等价于 ( 42 ) 格式说明符 " x ".

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

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

此外,在某些格式说明符上,space 实际上是有含义的,例如作为 fill character or as a sign option:

>>> 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'

有关详细信息,请参阅 Format Specification Mini-Language


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