>>> x = 'foo'
>>> x
'foo'
Entonces el nombre xse adjunta a la 'foo'cadena. Cuando llama, por ejemplo, repr(x)el intérprete pone en 'foo'lugar de xy luego llama repr('foo').
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repren realidad llama a un método mágico __repr__de x, que proporciona la cadena que contiene la representación del valor 'foo'asignado a x. Por lo tanto, vuelve 'foo'dentro de la cadena que ""resulta en "'foo'". La idea de repres dar una cadena que contenga una serie de símbolos que podamos escribir en el intérprete y obtener el mismo valor que se envió como argumento repr.
>>> eval("'foo'")
'foo'
Cuando llamamos eval("'foo'"), es lo mismo que escribimos 'foo'en el intérprete. Es como escribimos directamente el contenido de la cadena externa ""en el intérprete.
>>> 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
Si llamamos eval('foo'), es lo mismo que escribimos fooen el intérprete. Pero no hay una foovariable disponible y se genera una excepción.
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
stres solo la representación de cadena del objeto (recuerde, xvariable se refiere a 'foo'), por lo que esta función devuelve cadena.
>>> str(5)
'5'
La representación de cadena del número entero 5es '5'.
>>> str('foo')
'foo'
Y la representación de cadena de cadena 'foo'es la misma cadena 'foo'.