繁体   English   中英

文本格式错误:字符串格式说明符中不允许使用“=”对齐

[英]Text formatting error: '=' alignment not allowed in string format specifier

'=' 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"是文本,而不是数字。 但错误消息似乎与此无关。

错误消息中没有任何内容表明为什么“'='对齐”是相关的,并且它没有出现在代码中。 那么发出该错误消息有什么意义呢?

出现错误消息是因为格式说明符隐含了'=' alignment

str.format格式规范迷你语言解析器决定了对齐说明符“=”,因为:

在宽度字段前面加上零 ('0') 字符可以启用数字类型的符号感知零填充。 这等效于对齐类型为“=”的填充字符“0”。

因此,通过将0N指定为“零填充到 N 宽度”,您暗示了“输入是数字类型”和“零应该在符号和数字之间”。 后一个含义是'=' alignment含义。

由于值"1"不是数字,“=”对齐处理代码会引发该异常。 该消息的编写是希望您知道它在说什么,因为您要求(暗示)“=”对齐。

是的,我认为该错误消息需要改进。 为此提出了一个问题

一种解决方法是使用'>' (右对齐)填充,其语法如下:

[[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默认为0align=

=对齐方式指定为:

强制将填充放置在符号(如果有)之后但在数字之前。 这用于以“+000000120”形式打印字段。 此对齐选项仅对数字类型有效。 当 '0' 紧跟在字段宽度之前时,它成为默认值。

源(Python 3 文档)

这期望参数是int ,因为字符串没有符号。 所以我们只是手动将其设置为正常默认值> (右对齐)。

另请注意, 0仅指定fillalign的默认值。 您可以更改两者或仅更改对齐方式。

>>> # 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'

str.__format__不知道如何处理您的03部分。 这只适用于数字:

>>> "{num:03}".format(num=1)
'001'

如果你真的想要零填充一个字符串,你可以使用rjust

>>> "1".rjust(3, "0")
'001'

就我而言,我试图用零填充字符串而不是数字。

解决方案只是在应用填充之前将文本转换为数字:

num_as_text = '23'
num_as_num = int(num_as_text)
padded_text = f'{num_as_num:03}'

您试图在需要浮点数-> 3.44 的地方插入 'string->"1" 。 去掉引号“1”,即num=1,就可以了

这种格式是可以接受的

"{num}:03".format(num="1")

但是您指定占位符的方式{num:03}不是。 不过,这是一个有趣的 ValueError,如果您删除:有趣的错误将被标准KeyError替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM