Как говорится в заголовке, в чем разница между этими двумя флагами? Кажется, они оба преобразуют значение в строку с помощью функции repr()?
Кроме того, в этой строке кода:
"{0!r:20}".format("Hello")
Что делает 0 перед символом! r?
Ответ 1
%r не является допустимым заполнителем в операциях форматирования str.format(); он работает только в старом стиле % форматировании строк. Он действительно преобразует объект в представление через функцию repr().
В str.format(), !r является эквивалентом, но это также означает, что теперь вы можете использовать все коды формата для строки, Обычно str.format() вызывает метод object.__format__() для самого объекта, но используя !r, вместо этого используется repr(object).__format__().
Существуют также преобразователи !s и (в Python 3) !a; они сначала применяют функции str() и ascii().
0 впереди указывает, какой аргумент для метода str.format() будет использоваться для заполнения этого слота; позиционный аргумент 0 равен "Hello" в вашем случае. Вы также можете использовать именованные аргументы и передавать объекты в качестве аргументов ключевого слова:
"{greeting!r:20}".format(greeting="Hello")
Если вы не используете Python 2.6, вы можете опустить это как слоты без индексов или имена автоматически пронумерованы; первый {} равен 0, второй {} принимает второй аргумент в индексе 1 и т.д.