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

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

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

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

Вопросы:

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

Ответ 1

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

Ответ 2

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

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

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

x = 'foo'
y = x

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

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

Ответ 4

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

foo = 'bar'
baz(foo)

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

Ответ 5

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

Пример:

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