Ошибка форматирования текста: выравнивание '=' не допускается в спецификаторе формата строки

Что означает '=' 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" - это текст, а не номер. Но сообщение об ошибке, похоже, не имеет к этому никакого отношения.

Ничто в сообщении об ошибке не указывает, почему "'=" выравнивание "имеет значение, и он не отображается в коде. Итак, каково значение испускания этого сообщения об ошибке?

Ответ 1

Сообщение об ошибке возникает, поскольку '=' alignment подразумевается спецификатором формата.

Параметр str.format format mini-language определил спецификатор выравнивания "=" , потому что:

Предшествующее поле ширины символом нуля ('0') позволяет sign-aware zero-padding для числовых типов. Это эквивалентно введите символ '0' с типом выравнивания '='.

Итак, указав 0N как "нулевое дополнение к ширине N", вы подразумеваете, что "ввод является числовым типом", а "нули должны идти между знаком и цифрами". Это последнее значение подразумевается под '=' alignment.

Так как значение "1" не является числовым, код обработки выравнивания "=" повышает это исключение. Сообщение написано, ожидая, что вы знаете, о чем он говорит, потому что вы запросили (по смыслу) выравнивание "=" .

Да, я думаю, что сообщение об ошибке должно быть улучшено. Я поднял вопрос для этого.

Ответ 2

Обходной путь заключается в использовании дополнения '>' (right justify), которая имеет синтаксис:

[[fill]align][width]

с выравниванием > и заполнением 0.

Заполните значения по умолчанию space.

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

Проблема заключалась в том, что выравнивание по умолчанию равно =, что означает

Заставляет отступы помещаться после знака (если есть), но перед цифрами. Это используется для печати полей в форме "+000000120". Этот параметр выравнивания действителен только для числовых типов. Он становится значением по умолчанию, когда '0 немедленно предшествует ширине поля.

Источник (документы Python 3)

В строке нет знака. Вы также можете указать выравнивание вручную и использовать синтаксис:

[align]0[width]
>>> "{num:>03}".format(num="1")
'001'

Также обратите внимание:

>>> "{num:^03}  {num:<03}".format(num="1")
'010  100'

который работает с одной и той же логикой, но для выравнивания слева выравнивается (<) и center (^)

Ответ 3

str.__format__ не знает, что делать с вашей частью 03. Это работает только с цифрами:

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

Если вы действительно хотите нуль-pad строку, вы можете использовать rjust:

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

Ответ 4

Вы пытаетесь вставить 'string → "1", где требуется float- > 3.44. Удалите кавычки "1", т.е. Num = 1, и он будет работать

Ответ 5

Этот формат будет приемлемым

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

но то, как вы указали указанный тег {num:03}, не является. Это интересный ValueError, хотя, если вы удалите :, интересная ошибка заменяется стандартом KeyError.