Понимание функции repr() в Python
repr()
: оцениваемое строковое представление объекта (может "eval()" его, что означает, что это строковое представление, которое оценивает объект Python)
Другими словами:
>>> x = 'foo'
>>> repr(x)
"'foo'"
Вопросы:
- Почему я получаю двойные кавычки, когда я делаю
repr(x)
? (Я не получаю их, когда я делаюstr(x)
) - Почему я получаю
'foo'
когда я делаюeval("'foo'")
а не х какой объект?
5 ответов
>>> 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'
,
Отзывы, которые вы получаете на интерактивном переводчике, используют 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
выход.
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() показывает официальное представление объекта даты.
1) Результат repr('foo')
это строка 'foo'
, В вашей оболочке Python результат выражения также выражается как представление, так что вы по сути видите repr(repr('foo'))
,
2) eval
вычисляет результат выражения. Результатом всегда является значение (например, число, строка или объект). Несколько переменных могут ссылаться на одно и то же значение, как в:
x = 'foo'
y = x
x и y теперь относятся к одному и тому же значению.
3) Понятия не имею, что вы здесь имели в виду. Можете ли вы опубликовать пример, и что вы хотели бы видеть?
Когда ты сказал
foo = 'bar'
baz(foo)
ты не проходишь мимо foo
к baz
функция. foo
это просто имя, используемое для представления значения, в данном случае 'bar'
и это значение передается baz
функция.