что означает %r в python


что значит %r в следующем утверждении?

print '%r' % (1)

кажется, я слышал о %s,%d и %f но никогда не слышал об этом.

6 52

6 ответов:

Справочная информация:

в 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>.

чтобы ответить на ваш первоначальный вопрос:

%s str
%rrepr

кроме того:

вы можете управлять тем, как экземпляр ваших собственных классов преобразуется в строки с помощью реализация __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().

добавление к ответам, приведенным выше,'%r' может быть полезно в случае, когда у вас есть список с гетерогенным типом данных. Допустим, у нас есть list = [1, 'apple' , 2 , 'r','banana'] Очевидно, что в этом случае с помощью '%d' или '%s' вызовет ошибку. Вместо этого мы можем использовать '%r' для печати всех этих значений.

посмотреть Операции Форматирования Строк в документации. Обратите внимание, что %s и %d и т. д. могут работать иначе, чем вы ожидаете, если вы привыкли к тому, как они работают на другом языке, например C.

в частности, %s также хорошо работает для ints и поплавков, если у вас нет специальных требований к форматированию, где %d или %f даст вам больше контроля.

%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'