Позиционные аргументы в форматировании строки 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),

Другие вопросы по тегам