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

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

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

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

Вопросы:

  1. Почему я получаю двойные кавычки, когда я делаю repr(x)? (Я не получаю их, когда я делаю str(x))
  2. Почему я получаю '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 функция.

Другие вопросы по тегам