Ошибка форматирования текста: выравнивание '=' не допускается в спецификаторе формата строки
Что означает '=' 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
.