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