Python字符串格式中的位置参数:str.format vs f-string

Jon*_*ler 2 python string format positional-parameter python-3.6

当尝试使用新的(和令人敬畏的)python 3 文字字符串插值的一些功能时,我发现了这种奇怪的区别.

例如,使用旧的str.format,我可以格式化具有动态数字位数的整数,如下所示:

>>> d = 5
>>> N = 3
>>> '{:0{N}d}'.format(d, N=N)
'005' 
Run Code Online (Sandbox Code Playgroud)

但是当我使用文字字符串尝试等效时,我收到一个错误:

>>> f'{:0{N}d}'
SyntaxError: f-string: empty expression not allowed
Run Code Online (Sandbox Code Playgroud)

只有通过交换参数的顺序,才能获得正确的格式

>>> f'{d:0{N}}'
'005'
Run Code Online (Sandbox Code Playgroud)

这让我觉得奇怪,因为我以为我可以在不修改字符串的情况下交换到f字符串,只调用调用.

str.format和f-string 之间的语法差异是什么?为什么这个例子略有不同?

use*_*ica 10

你误会了什么'{:0{N}d}'.format(d, N=N).该d格式规范不引用变量d; 它意味着在基数10中打印一个整数.Python将该字段与d参数进行位置匹配.

当你尝试使用f-string时f'{:0{N}d}',f-strings没有位置参数.Python不知道该字段的格式.你需要修复你原来的bug并放在d前面,:所以Python知道它应该在d那里格式化.

作为参考,正确的版本format会一直'{d:0{N}}'.format(d=d, N=N).