当尝试使用新的(和令人敬畏的)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 :(得分:9)
你误解了'{:0{N}d}'.format(d, N=N)
的作用。格式规范中的d
未引用变量d
;它意味着在基数10中打印一个整数.Python将该字段与d
参数进行位置匹配。
使用f-string f'{:0{N}d}'
尝试时,f-strings没有位置参数。 Python不知道该字段的格式。您需要修复原始错误并将d
放在:
前面,以便Python知道它应该格式化d
。
作为参考,format
的正确版本为'{d:0{N}}'.format(d=d, N=N)
。