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

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

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

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

вопросы:

  1. почему я получаю двойные кавычки, когда я делаю repr(x)? (Я не понимаю их. когда я делаю str(x))
  2. почему я получаю 'foo' когда я делаю eval("'foo'") и не x, который является объект?

5 ответов


>>> 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 is '5'.

>>> str('foo')
'foo'

и строковое представление string 'foo' это та же строка 'foo'.


обратная связь, которую вы получаете на интерактивном интерпретаторе использует repr тоже. Когда вы вводите выражение (пусть это будет expr), переводчик в основном делает result = expr; if result is not None: print repr(result). Итак, вторая строка в вашем примере и форматирование строки foo в представление, которое вы хотите ('foo'). И тогда интерпретатор создает representation это, оставив вас с двойными кавычками.

почему, когда я объединяю %r с двойной кавычкой и одиночная цитата ускользает и распечатывает их, она печатает ее так, как я бы написал ее в своем.файл py, но не так, как я хотел бы его видеть?

Я не уверен, что вы спрашиваете здесь. Текст single ' and double " quotes при запуске через repr, включает в себя побеги для одного вида цитаты. Конечно, это так, иначе это не был бы допустимый строковый литерал по правилам Python. Это именно то, что вы просили, позвонив repr.

также обратите внимание, что eval(repr(x)) == x аналогия не буквальная. Это приближение и справедливо для большинства (всех?) встроенные типы, но главное, что вы получаете довольно хорошее представление о типе и логическом "значении", глядя на repr выход.


1) результат repr('foo') это строка 'foo'. В вашей оболочке Python результат выражения также выражается как представление, поэтому вы по существу видите repr(repr('foo')).

2) eval вычисляет результат выражения. Результат всегда стоимостью (например, число, строка или объект). Несколько переменных могут ссылаться на одно и то же значение, как в:

x = 'foo'
y = x

x и y теперь относятся к тому же значение.

3) я понятия не имею, что вы имели в виду здесь. Можете ли вы опубликовать пример, и что вы хотели бы видеть?


когда вы говорите

foo = 'bar'
baz(foo)

вы не проходя foo до


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