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