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

На странице 21 Learn Python the Hard Way я вижу этот пример кода:

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

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


person coffee-grinder    schedule 14.05.2011    source источник


Ответы (4)


Спецификатор %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, который нельзя гарантировать воссоздать в другом контексте.

person Ben James    schedule 14.05.2011
comment
Мне нравится этот пример, потому что он показывает большую разницу между% s и% r ... в большинстве примеров просто показано что-то вроде «яблоко» или «яблоко», и тогда непонятно, почему у нас вообще есть% r. - person macloo; 12.01.2013
comment
Как реализовать спецификатор% в Python 3.3? Я также слежу за последовательностью «Learn Python the Hard Way», но обнаружил, что существует ряд синтаксических различий между версиями Python. - person nitrl; 18.07.2013
comment
Спасибо. Мне было интересно, почему можно использовать% r - но теперь я понимаю из вашего примера выше. - person Helen Neely; 16.01.2014
comment
Важное различие при их использовании в форматировании строк состоит в том, что% r также будет включать в себя ограничивающие кавычки. print ('Text:% r'% 'Hello') - ›Text: 'Hello', print ('Text:% s'% 'Hello') -› Text Hello - person Markus; 10.01.2018

Используйте %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 the Hard Way.

person Pramod Bhat    schedule 30.11.2013

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

Это будет так:

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

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

I said: There are 10 types of people..
person manojlds    schedule 14.05.2011
comment
верно только для строк, другие типы имеют другое поведение - person Winston Ewert; 15.05.2011
comment
@Winston Ewert - конечно, я отвечал на пример вопроса, поскольку в этом примере он явно использовался для создания цитат. - person manojlds; 15.05.2011

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

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

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

person macloo    schedule 11.01.2013
comment
Что это добавляет к его ответу? - person fugu; 22.02.2016
comment
@fugu на самом деле дает пример распечатки с использованием спецификаторов %r и %s, чтобы пользователи могли более четко видеть различия. - person amanuel2; 11.01.2017
comment
Спасибо @ amanuel2 - именно мое намерение. - person macloo; 05.02.2017