Python 字符串格式中的位置参数:str.format 与 f-string
Positional arguments in Python string formatting: str.format vs f-string
在试用新的(很棒的)python 3 literal string interpolation 的一些功能时,我发现了这个奇怪的差异。
例如,使用旧的 str.format
,我可以像这样用动态位数格式化整数:
>>> d = 5
>>> N = 3
>>> '{:0{N}d}'.format(d, N=N)
'005'
但是当我尝试使用文字字符串进行等效操作时,出现错误:
>>> f'{:0{N}d}'
SyntaxError: f-string: empty expression not allowed
只有交换参数的顺序才能得到正确的格式
>>> f'{d:0{N}}'
'005'
这让我觉得很奇怪,因为我认为我可以只切换到 f 字符串而不修改我的字符串,只修改调用。
str.format
和 f-string 在句法上有什么区别?为什么这个例子略有不同?
您误解了 '{:0{N}d}'.format(d, N=N)
的作用。格式规范中的 d
没有引用变量 d
;这意味着以 10 为基数打印一个整数。Python 将该字段与 d
参数位置匹配。
当您尝试使用 f 字符串 f'{:0{N}d}'
时,f 字符串没有位置参数。 Python 不知道该字段的格式。您需要修复原始错误并将 d
放在 :
前面,这样 Python 就知道它应该在那里格式化 d
。
供参考,带有 format
的正确版本应该是 '{d:0{N}}'.format(d=d, N=N)
。
在试用新的(很棒的)python 3 literal string interpolation 的一些功能时,我发现了这个奇怪的差异。
例如,使用旧的 str.format
,我可以像这样用动态位数格式化整数:
>>> d = 5
>>> N = 3
>>> '{:0{N}d}'.format(d, N=N)
'005'
但是当我尝试使用文字字符串进行等效操作时,出现错误:
>>> f'{:0{N}d}'
SyntaxError: f-string: empty expression not allowed
只有交换参数的顺序才能得到正确的格式
>>> f'{d:0{N}}'
'005'
这让我觉得很奇怪,因为我认为我可以只切换到 f 字符串而不修改我的字符串,只修改调用。
str.format
和 f-string 在句法上有什么区别?为什么这个例子略有不同?
您误解了 '{:0{N}d}'.format(d, N=N)
的作用。格式规范中的 d
没有引用变量 d
;这意味着以 10 为基数打印一个整数。Python 将该字段与 d
参数位置匹配。
当您尝试使用 f 字符串 f'{:0{N}d}'
时,f 字符串没有位置参数。 Python 不知道该字段的格式。您需要修复原始错误并将 d
放在 :
前面,这样 Python 就知道它应该在那里格式化 d
。
供参考,带有 format
的正确版本应该是 '{d:0{N}}'.format(d=d, N=N)
。