簡體   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