为什么 f"{11: 2d}" 不填充到 2 个字符?

Why does f"{11: 2d}" not pad to 2 characters?

我正在使用 Ipython 7.0.1Python 3.6.9

我想用格式字符串迷你语言右对齐数字。我使用 111 作为 1 位和 2 位数字的示例,我想将它们填充到总共 2 个字符。

对于零填充,一切都按预期工作,> 是可选的,因为它是默认值:

In [0]: print(f"{1:02d}\n{11:02d}\n{1:0>2d}\n{11:0>2d}")                                         
01
11
01
11

但是当我想用 spaces 填充时,只要我离开 space 它也可以工作,因此它默认为 space:

In [1]: print(f"{1:2d}\n{11:2d}\n{1:>2d}\n{11:>2d}")                                             
 1
11
 1
11

但是如果我明确地输入 space,我对结果感到惊讶:

In [2]: print(f"{1: 2d}\n{11: 2d}\n{1: >2d}\n{11: >2d}")                                         
 1
 11
 1
11

这是为什么?

全部在文档中...

format_spec ::= [[fill]align][sign]...

If a valid align value is specified, it can be preceded by a fill character

由于 fillsign 都可以是 space,所以它会产生歧义,因此 space 因为 fill 必须后跟 align.

以下是 Python 对您最后一行的解释:

f"{1: 2d}"    #interpreted as sign therefore (accidentally) same effect  -> " 1"
f"{11: 2d}"   #interpreted as sign therefore a leading space is inserted -> " 11"
f"{1: >2d}"   #align is present, pad with ' '                            -> " 1"
f"{11: >2d}"  #align is present, pad with ' ' but number long enough     -> "11"