Что делает !r в функциях str() и repr()?

Согласно документации Python 2.7.12:

!s (применить str()) и !r (применить repr()) можно использовать для преобразования значения перед его форматированием.

>>> import math
>>> print 'The value of PI is approximately {}.'.format(math.pi)
The value of PI is approximately 3.14159265359.
>>> print 'The value of PI is approximately {!r}.'.format(math.pi)
The value of PI is approximately 3.141592653589793.

Интересно, что преобразованное значение является результатом repr(), а не str().

>>> str(math.pi)
'3.14159265359'
>>> repr(math.pi)
'3.141592653589793'

Так что же здесь означает «преобразовать значение»? Сделать его менее удобочитаемым?


person nalzok    schedule 17.07.2016    source источник
comment
Интересно наблюдать разную точность для str(..) и repr(..), хотя   -  person UltraInstinct    schedule 17.07.2016


Ответы (1)


Чтобы отформатировать что-то в строке, сначала необходимо создать строковое представление этого чего-то. convert the value в основном говорит о том, как должно быть построено строковое представление. В python есть два довольно естественных варианта получения строкового представления чего-либо... str и repr. str обычно немного более удобен для человека, repr обычно более точен. Возможно, официальная документация — лучшее место для поиска разница:

object.__repr__(self)

  • Вызывается встроенной функцией repr() для вычисления «официального» строкового представления объекта. Если это вообще возможно, это должно выглядеть как допустимое выражение Python, которое можно использовать для воссоздания объекта с тем же значением (при соответствующей среде). Если это невозможно, должна быть возвращена строка вида <...some useful description...>. Возвращаемое значение должно быть строковым объектом. Если класс определяет __repr__(), но не __str__(), то __repr__() также используется, когда требуется «неформальное» строковое представление экземпляров этого класса.

  • Обычно это используется для отладки, поэтому важно, чтобы представление было информативным и недвусмысленным.

object.__str__(self)

  • Вызывается функцией str(object) и встроенными функциями format() и print() для вычисления "неформального" или удобного для печати строкового представления объекта. Возвращаемое значение должно быть строковым объектом.

  • Этот метод отличается от object.__repr__() тем, что не ожидается, что __str__() вернет допустимое выражение Python: можно использовать более удобное или краткое представление.

  • Реализация по умолчанию, определенная встроенным объектом типа, вызывает object.__repr__().

В str.format !s выбирает использование str для форматирования объекта, тогда как !r выбирает repr для форматирования значения.

Разницу легко увидеть со строками (поскольку repr для строки будет включать внешние кавычки).:

>>> 'foo {}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"

Какая разница между этими двумя методами на самом деле критически зависит от форматируемых объектов. Для многих объектов (например, тех, которые не переопределяют метод __str__) не будет разницы в форматированном выводе.

person mgilson    schedule 17.07.2016