Понимание функции repr () в Python - PullRequest
136 голосов
/ 16 октября 2011

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

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

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

Вопросы:

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

Ответы [ 5 ]

157 голосов
/ 16 октября 2011
>>> 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'.

9 голосов
/ 16 октября 2011

Отзывы, которые вы получаете по интерактивному переводчику, также используют 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.

3 голосов
/ 16 октября 2011

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

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

x = 'foo'
y = x

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

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

2 голосов
/ 08 апреля 2018

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 () показывает официальное представление объекта даты.

2 голосов
/ 16 октября 2011

Когда вы говорите

foo = 'bar'
baz(foo)

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

...