какой смысл %r
в следующем утверждении?
print '%r' % (1)
Я думаю, что слышал о %s
, %d
и %f
, но никогда не слышал об этом.
какой смысл %r
в следующем утверждении?
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 == to self
return "Foo(%r)" % self.foo
Он вызывает repr()
объекта и вставляет результирующую строку.
Он печатает замену как строку с помощью repr()
.
Добавление к ответам, приведенным выше, '%r'
может быть полезно в сценарии, где у вас есть список с разнородным типом данных.
Пусть, скажем, a list = [1, 'apple' , 2 , 'r','banana']
Очевидно, что в этом случае использование '%d'
или '%s'
приведет к ошибке. Вместо этого мы можем использовать '%r'
для печати всех этих значений.
Разница между %r
и %s
состоит в том, что %r
вызывает метод repr()
а %s
вызывает метод str()
. Оба из них являются встроенными функциями Python.
Метод repr()
возвращает печатаемое представление данного объекта. Метод str()
возвращает "неформальное" или хорошо отображаемое представление данного объекта.
Проще говоря, метод str()
выполняет вывод результата так, как конечный пользователь хотел бы видеть:
name = "Adam"
str(name)
Out[1]: 'Adam'
Метод repr()
напечатает или покажет, как на самом деле выглядит объект:
name = "Adam"
repr(name)
Out[1]: "'Adam'"
%s
вызывает метод __str()__
для выбранного объекта и заменяет собой возвращаемое значение,
%r
вызывает метод __repr()__
выбранного объекта и заменяет себя возвращаемым значением.
%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'
См. Операции форматирования строк в документах. Обратите внимание, что% s и% d и т.д. Могут работать по-другому, как вы ожидаете, если вы привыкли к тому, как они работают на другом языке, таком как C.
В частности,% s также хорошо работает для int и float, если у вас нет специальных требований к форматированию, где% d или% f даст вам больше контроля.