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
.
我和一位同事使用 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
.