В чем смысл %r
в следующем утверждении?В чем смысл% r в python
print '%r' % (1)
Я думаю, что я слышал о %s
, %d
и %f
, но никогда не слышал об этом.
В чем смысл %r
в следующем утверждении?В чем смысл% r в python
print '%r' % (1)
Я думаю, что я слышал о %s
, %d
и %f
, но никогда не слышал об этом.
фона:
В Python есть две встроенные функции для поворота объекта в строку: str
против repr
. str
должен быть дружественной, удобочитаемой для пользователя строкой. repr
должен содержать подробную информацию о содержимом объекта (иногда они возвращают то же самое, что и для целых чисел). По соглашению, если есть выражение Python, которое будет eval для другого объекта, который является ==, repr
вернет такое выражение, например.
>>> print repr('hi') 'hi' # notice the quotes here as opposed to... >>> print str('hi') hi
Если возвращение выражение не имеет смысла для объекта, repr
должен возвращать строку, которая окруженное < и> символов, например, <blah>
.
Чтобы ответить на исходный вопрос:
Дополнительно:
Вы можете управлять тем, как экземпляр ваших собственных классов преобразования в путем применения методов __str__
и __repr__
.
class Foo:
def __init__(self, foo):
self.foo = foo
def __eq__(self, other):
"""Implements ==."""
return self.foo == other.foo
def __repr__(self):
# if you eval the return value of this function,
# you'll get another Foo instance that's == to self
return "Foo(%r)" % self.foo
Он называет repr()
объекту и вставляет полученную строку.
Он печатает замену в виде строки repr()
.
См. String Formatting Operations в документах. Обратите внимание, что% s и% d и т. Д. Могут работать по-другому, как вы ожидаете, если вы привыкли к тому, как они работают на другом языке, например C.
В частности,% s также хорошо работает для целых чисел и поплавков, если только вы имеют особые требования к форматированию, где% d или% f даст вам больше контроля.
Добавление к ответам, приведенным выше, '%r'
может быть полезным в случае, когда у вас есть список с гетерогенным типом данных. Предположим, что у нас есть list = [1, 'apple' , 2 , 'r','banana']
Очевидно, что в этом случае использование '%d'
или '%s'
приведет к ошибке. Вместо этого мы можем использовать '%r'
для печати всех этих значений.
Просьба отредактировать свой ответ – Rajesh
%s <=> str
%r <=> repr
%r
вызовы repr()
на объекте, и вставляет полученную строку, возвращаемую __repr__
.
Строка, возвращаемая __repr__
, должна быть недвусмысленной и, если возможно, соответствовать исходному коду, который необходим для воссоздания представляемого объекта.
Быстрый пример:
class Foo:
def __init__(self, foo):
self.foo = foo
def __repr__(self):
return 'Foo(%r)' % self.foo
def __str__(self):
return self.foo
test = Foo('Text')
Так,
in[1]: test
Out[1]: Foo('Text')
in[2]: str(test)
Out[2]: 'Text'
Я нашел% г полезной для печати строки неизвестного кодирования, когда в противном случае ошибка может получить брошенный с% с – dan