Понимание функции repr () в Python

152

repr(): оцениваемое строковое представление объекта (может «eval ()» его, что означает, что это строковое представление, которое оценивает объект Python)

Другими словами:

>>> x = 'foo'
>>> repr(x)
"'foo'"

Вопросы:

  1. Почему я получаю двойные кавычки, когда я делаю repr(x)? (Я не получаю их, когда я делаю str(x))
  2. Почему я получаю, 'foo'когда я делаю, eval("'foo'")а не х, который является объектом?
0101amt
источник

Ответы:

166
>>> x = 'foo'
>>> x
'foo'

Таким образом, имя xприкреплено к 'foo'строке. Когда вы звоните, например, repr(x)переводчик ставит 'foo'вместо, xа затем звонит repr('foo').

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

reprна самом деле вызывает метод магического __repr__из x, который дает строку , содержащую представление значения 'foo'присвоенного x. Таким образом, он возвращается 'foo'внутри строки, что ""приводит к "'foo'". Идея reprсостоит в том, чтобы дать строку, которая содержит серию символов, которые мы можем ввести в интерпретаторе и получить то же значение, которое было отправлено в качестве аргумента repr.

>>> eval("'foo'")
'foo'

Когда мы звоним eval("'foo'"), это то же самое, что мы печатаем 'foo'в интерпретаторе. Это как мы напрямую вводим содержимое внешней строки ""в интерпретаторе.

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

Если мы звоним eval('foo'), это то же самое, что мы печатаем fooв интерпретаторе. Но нет fooдоступных переменных, и возникает исключение.

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

strэто просто строковое представление объекта (помните, xпеременная ссылается 'foo'), поэтому эта функция возвращает строку.

>>> str(5)
'5'

Строковое представление целого числа 5есть '5'.

>>> str('foo')
'foo'

И строковое представление строки 'foo'это та же строка 'foo'.

ovgolovin
источник
Можете ли вы также сообщить нам некоторые случаи использования, когда следует использовать функцию repr. Я не могу этого понять
гаурав парашар
14

Отзывы, которые вы получаете на интерактивном переводчике, reprтоже используются . Когда вы вводите выражение (пусть оно будет expr), интерпретатор в основном это делает result = expr; if result is not None: print repr(result). Итак, вторая строка в вашем примере - это форматирование строки fooв нужное вам представление ( 'foo'). И тогда переводчик создает reprощущение этого , оставляя вас с двойными кавычками.

Почему, когда я комбинирую% r с двойными кавычками и экранированными одинарными кавычками и распечатываю их, он печатает его так, как я бы записал его в свой файл .py, а не так, как я хотел бы видеть?

Я не уверен, что вы спрашиваете здесь. Текст single ' and double " quotes, когда он проходит repr, включает экранирование для одного вида цитаты. Конечно, это так, иначе это не будет действительный строковый литерал по правилам Python. Это именно то, что вы просили, позвонивrepr .

Также обратите внимание, что eval(repr(x)) == xаналогия не подразумевается буквально. Это приближение и справедливо для большинства (всех?) Встроенных типов, но главное, что вы получите достаточно хорошее представление о типе и логическом «значении» при просмотре reprвыходных данных.

Влад
источник
2
Первоначально, он на самом деле был призван быть буквальным: каждое значение - х reprдолжно быть что - то , что можно передать eval(или скопировать и вставить в исходный код) для получения равной ценности, или что - то , что поднимет SyntaxError , когда вы пытаетесь что ( как правило , <…>стиль производства object.__repr__). Это постепенно снижалось с течением времени, и к 2.7 и 3.x это просто верно «для многих типов», и есть исключения даже в stdlib (например, namedtupleтип, созданный как локальный, даст reprвам возможность » т eval), но это была оригинальная идея.
abarnert
7

str () используется для создания вывода для конечного пользователя, в то время как repr () используется для разработки отладки. И представляет официальный объект объекта.

Пример:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

Из вывода мы видим, что repr () показывает официальное представление объекта даты.

Tanim_113
источник
3

1) Результатом repr('foo')является строка 'foo' . В вашей оболочке Python результат выражения также выражается в виде представления, так что вы, по сути, видите repr(repr('foo')).

2) evalвычисляет результат выражения. Результатом всегда является значение (например, число, строка или объект). Несколько переменных могут ссылаться на одно и то же значение, как в:

x = 'foo'
y = x

x и y теперь относятся к одному и тому же значению.

3) Понятия не имею, что вы здесь имели в виду. Можете ли вы опубликовать пример, и что вы хотели бы увидеть?

phihag
источник
1

Когда ты говоришь

foo = 'bar'
baz(foo)

Вы не переходите fooк bazфункции. fooв данном случае это просто имя, используемое для представления значения 'bar', и это значение передается bazфункции.

SingleNegationElimination
источник