Позиционные аргументы в форматировании строки Python: str.format vs f-string
При тестировании некоторых функций с новой (и удивительной) интерполяцией буквенных строк Python 3 я обнаружил эту странную разницу.
Например, используя старый str.format
Я могу отформатировать целые числа с динамическим числом цифр, как это:
>>> d = 5
>>> N = 3
>>> '{:0{N}d}'.format(d, N=N)
'005'
Но когда я пробую эквивалент с использованием буквенных строк, я получаю сообщение об ошибке:
>>> f'{:0{N}d}'
SyntaxError: f-string: empty expression not allowed
Только меняя порядок аргументов, я получаю правильное форматирование
>>> f'{d:0{N}}'
'005'
Это показалось мне странным, так как я предполагал, что могу просто поменять f-строки, не изменяя мои строки, только вызовы.
Каковы синтаксические различия между str.format
а ф-нить? И почему этот пример немного отличается?
1 ответ
Вы неправильно поняли, что '{:0{N}d}'.format(d, N=N)
делает. d
в спецификации формата не относится к переменной d
; это означает печать целого числа в базе 10. Python сопоставляет это поле с d
аргумент позиционно.
Когда вы попробуете это с F-струной, f'{:0{N}d}'
У f-строк нет позиционных аргументов. Python не знает, что форматировать для этого поля. Вам нужно исправить исходную ошибку и разместить d
напротив :
поэтому Python знает, что он должен отформатировать d
там.
Для справки, правильная версия с format
был бы '{d:0{N}}'.format(d=d, N=N)
,