Понимание функции repr () в Python
repr()
: оцениваемое строковое представление объекта (can " eval()"
это означает, что это строковое представление, которое оценивает Python
объект)
другими словами:
>>> x = 'foo'
>>> repr(x)
"'foo'"
вопросы:
- почему я получаю двойные кавычки, когда я делаю
repr(x)
? (Я не понимаю их. когда я делаюstr(x)
) - почему я получаю
'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'
). И тогда интерпретатор создает repr
esentation это, оставив вас с двойными кавычками.
почему, когда я объединяю %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) я понятия не имею, что вы имели в виду здесь. Можете ли вы опубликовать пример, и что вы хотели бы видеть?
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.