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