'=' alignment
在以下错误消息中的含义是什么?为什么此代码会导致错误消息?
>>> "{num:03}".format(num="1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier
代码有一个微妙的问题:输入值"1"
是文本,而不是数字。但错误消息似乎与此无关。
错误消息中没有任何内容表明为什么“'='对齐”是相关的, 并且它不会出现在代码中。那么发出错误信息有什么意义呢?
答案 0 :(得分:35)
出现错误消息,因为格式说明符隐含了'=' alignment
。
str.format
format spec mini-language解析器决定了
对齐说明符“=”因为:
使用零('0')字符前面的宽度字段启用 符号识别数字类型的零填充。这相当于一个 用对齐类型'='填充'0'的字符。
因此,通过将0N
指定为“零填充到N宽度”,您隐含了“输入是数字类型”,“零应该在符号和数字之间”。后一种含义是'=' alignment
的含义。
由于值"1"
不是数字,因此“=” - 对齐处理代码会引发该异常。写下这条消息,期待你知道它在说什么,因为你要求(暗示)“=”对齐。
是的,我认为错误信息需要改进。我raised an issue for that。
答案 1 :(得分:8)
解决方法是使用'>'
(右对齐)填充,其语法如下:
[[fill]align][width]
对齐为>
,填充为0
,宽度为3
。
>>> "{num:0>3}".format(num="1")
'001'
问题在于格式规范中有不同的0
:
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type] # ^^^ This one
该零只会使fill
默认为0
而align
默认为=
。
=
对齐指定为:
强制将填充放置在符号(如果有)之后但在数字之前。这用于以“+000000120”形式打印字段。此对齐选项仅对数字类型有效。当'0'紧跟在字段宽度之前时,它将成为默认值。
这要求参数为int
,因为字符串没有符号。所以我们只需手动将其设置为正常默认值>
(右对齐)。
另请注意,0
仅指定fill
和align
的默认值。您可以更改两者或仅更改对齐。
>>> # fill defaults to '0', align is '>', `0` is set, width is `3`
>>> "{num:>03}".format(num=-1)
'0-1'
>>> # fill is `x`, align is '>', `0` is set (but does nothing), width is `"3"`
>>> "{num:x>03}".format(num=-1)
'x-1'
>>> # fill is `x`, align is '>', `0` is set (but does nothing), width is `"03"` (3)
>>> "{num:x>003}".format(num=-1)
'x-1'
答案 2 :(得分:5)
str.__format__
不知道如何处理03
部分。这只适用于数字:
>>> "{num:03}".format(num=1)
'001'
如果您确实想要填充字符串,可以使用rjust
:
>>> "1".rjust(3, "0")
'001'
答案 3 :(得分:3)
在我的情况下,我试图将字符串而不是数字零填充。
解决方案是在应用填充之前将文本转换为数字:
num_as_text = '23'
num_as_num = int(num_as_text)
padded_text = f'{num_as_num:03}'
答案 4 :(得分:0)
您正在尝试插入&#39; string-&gt;&#34; 1&#34;其中float-> 3.44是必需的。删除引号&#34; 1&#34;,即num = 1,它将起作用
答案 5 :(得分:-1)
这种格式是可以接受的
"{num}:03".format(num="1")
但是您指定占位符{num:03}
的方式不是。这是一个有趣的ValueError,但如果删除:
,则有趣的错误会被标准KeyError
取代。