В чем разница между r и% r в Python?

Как говорится в заголовке, в чем разница между этими двумя флагами? Кажется, они оба преобразуют значение в строку с помощью функции 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 и т.д.