#python #repr
#python #repr
Вопрос:
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'
.
Комментарии:
1. Можете ли вы также сообщить нам о некоторых вариантах использования, когда следует использовать функцию repr. Я не могу понять, что
Ответ №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
выходные данные.
Комментарии:
1. Первоначально это должно было быть буквальным: каждое значение
repr
должно быть либо чем-то, что можно передатьeval
(или скопировать и вставить в ваш исходный код) для получения равного значения, либо чем-то, что вызовет ошибку SyntaxError при попытке этого (обычно<…>
стиль, созданныйobject.__repr__
). С годами это постепенно смягчалось, и к 2.7 и 3.x это просто верно «для многих типов», и даже в stdlib есть исключения (например,namedtuple
тип, созданный как локальный, даст вамrepr
, что вы не можетеeval
), но это был оригиналидея.
Ответ №3:
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()
это показывает официальное представление объекта date.
Ответ №4:
1) Результатом repr('foo')
является строка 'foo'
. В вашей оболочке Python результат выражения также выражается в виде представления, так что вы, по сути, видите repr(repr('foo'))
.
2) eval
вычисляет результат выражения. Результатом всегда является значение (например, число, строка или объект). Несколько переменных могут ссылаться на одно и то же значение, как в:
x = 'foo'
y = x
x и y теперь относятся к одному и тому же значению.
3) Я понятия не имею, что вы здесь имели в виду. Можете ли вы опубликовать пример и что бы вы хотели увидеть?
Ответ №5:
Когда вы говорите
foo = 'bar'
baz(foo)
вы не переходите foo
к baz
функции. foo
в данном случае это просто имя, используемое для представления значения 'bar'
, и это значение передается baz
функции.