Вопрос-Ответ

Understanding repr( ) function in Python

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

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

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

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

Вопросы:


  1. Почему при выполнении я получаю двойные кавычкиrepr(x)? (Я их не получаю при выполненииstr(x))

  2. Почему я получаю '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__ of 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'

И строковое представление string '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

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) Я понятия не имею, что вы здесь имели в виду. Можете ли вы опубликовать пример и что бы вы хотели увидеть?

python