Когда использовать% r вместо% s в Python?

В Изучите жесткий путь Python стр. 21, я вижу этот пример кода:

x = "There are %d types of people." % 10
...
print "I said: %r." % x

Почему %r используется здесь вместо %s? Когда вы будете использовать %r, и когда вы будете использовать %s?

Ответ 1

Спецификатор %s преобразует объект с помощью str(), а %r преобразует его с помощью repr().

Для некоторых объектов, таких как целые, они дают одинаковый результат, но repr() является особенным в этом (для типов, где это возможно) он обычно возвращает результатом является действительный синтаксис Python, который можно было бы использовать для однозначного воссоздания объекта, который он представляет.

Вот пример, используя дату:

>>> import datetime
>>> d = datetime.date.today()
>>> str(d)
'2011-05-14'
>>> repr(d)
'datetime.date(2011, 5, 14)'

Типы, для которых repr() не содержат синтаксис Python, включают те, которые указывают на внешние ресурсы, такие как file, которые вы не можете гарантировать воссоздать в другом контексте.

Ответ 2

Используйте %r для отладки, поскольку он отображает "необработанные" данные переменной, но другие используются для отображения пользователям.

Как работает форматирование %r; он печатает его так, как вы его написали (или близко к нему). Это "сырой" формат для отладки. Здесь \n, используемый для отображения пользователям, не работает. %r показывает представление, если необработанные данные переменной.

months = "\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"
print "Here are the months: %r" % months

Вывод:

Here are the months: '\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug'

Отметьте этот пример от Learn Python Hard Way.

Ответ 3

%r показывает кавычки:

Это будет выглядеть так:

I said: 'There are 10 types of people.'.

Если вы использовали %s, это было бы:

I said: There are 10 types of people..

Ответ 4

Это версия ответа Бена Джеймса выше:

>>> import datetime
>>> x = datetime.date.today()
>>> print x
2013-01-11
>>> 
>>> 
>>> print "Today date is %s ..." % x
Today date is 2013-01-11 ...
>>> 
>>> print "Today date is %r ..." % x
Today date is datetime.date(2013, 1, 11) ...
>>>

Когда я запустил это, это помогло мне увидеть полезность% r.