Почему по меньшей мере 4 способа форматированного вывода, почему это не соотносится с принципом из PEP?

Цитата из The Zen of Python:

There should be one-- and preferably only one --obvious way to do it.

Примеры разнообразного кода:

'hello, %s' % name
f'hello,  { name } '
'hello,  {  } '.format(name)

Ответы (2 шт):

Автор решения: MaxU

Первый вариант уже морально устарел. Второй и третий дополняют друг друга. Например f-string не позволяет делать отложенную интерполяцию переменных. Т.е. если значение переменной на момент создания f-string вам неизвестно, тогда вам впоследствии придется воспользоваться str.format().

Пример:

s = f'hello,  {{name}}'
print(s)
name = 'Васисуалий'
print(s.format(name=name))

вывод:

hello,  {name}
hello,  Васисуалий

Я думаю основная причина в обратной совместимости. Наверняка вы бы не хотели исправлять тонны старого кода, если бы в новых версиях убрали возможность использовать 'hello, %s' % name.

→ Ссылка
Автор решения: CrazyElf

Потому что язык развивается, появляются всё более лучшие, современные способы форматирования. Они, кстати, параллельно в разных языках появляются, создатели языков перенимают общие практики друг у друга.

Современный предпочтительный способ форматирования только один - это f-строки, всё остальное оставлено в основном для совместимости с написанным ранее кодом.

→ Ссылка