Когда использовать% 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.