__repr__ - repr python 3
Comprender la funciĆ³n repr() en Python (5)
repr()
: representación de cadena evaluable de un objeto (puede "eval ()", lo que significa que es una representación de cadena que se evalúa como un objeto de Python)
En otras palabras:
>>> x = ''foo''
>>> repr(x)
"''foo''"
Preguntas:
- ¿Por qué obtengo las comillas dobles cuando hago
repr(x)
? (No los consigo cuando hagostr(x)
) - ¿Por qué me sale
''foo''
cuando hagoeval("''foo''")
y no x cuál es el objeto?
1) El resultado de repr(''foo'')
es la cadena ''foo''
. En su shell de Python, el resultado de la expresión también se expresa como una representación, por lo que básicamente está viendo repr(repr(''foo''))
.
2) eval
calcula el resultado de una expresión. El resultado siempre es un valor (como un número, una cadena o un objeto). Múltiples variables pueden referirse al mismo valor, como en:
x = ''foo''
y = x
xey ahora se refieren al mismo valor.
3) No tengo idea de lo que querías decir aquí. ¿Puedes publicar un ejemplo y lo que te gustaría ver?
Cuando tu dices
foo = ''bar''
baz(foo)
usted no está pasando foo
a la función baz
. foo
es solo un nombre usado para representar un valor, en este caso ''bar''
, y ese valor se pasa a la función baz
.
Los comentarios que recibe en el intérprete interactivo también usan repr
. Cuando escribe una expresión (que sea expr
), el intérprete básicamente hace result = expr; if result is not None: print repr(result)
result = expr; if result is not None: print repr(result)
. Entonces, la segunda línea en su ejemplo está formateando la cadena foo
en la representación que desea ( ''foo''
). Y luego el intérprete crea la repr
de eso , dejándote con comillas dobles.
¿Por qué cuando combino% r con comillas dobles y comillas simples e las imprimo, las imprime como las escribiría en mi archivo .py pero no de la manera en que me gustaría verlas?
No estoy seguro de lo que estás preguntando aquí. Las single '' and double " quotes
texto single '' and double " quotes
, cuando se ejecutan a través de repr
, incluyen escapes para un tipo de cita. Por supuesto que sí, de lo contrario no sería un literal de cadena válido según las reglas de Python. Eso es precisamente lo que solicitó al llamar a repr
.
También tenga en cuenta que la analogía eval(repr(x)) == x
no es literal. Es una aproximación y es válida para la mayoría (¿todos?) De los tipos incorporados, pero lo principal es que se obtiene una idea bastante buena del tipo y del "valor" lógico al mirar la salida repr
.
str () se utiliza para crear resultados para el usuario final mientras que repr () se usa para el desarrollo de depuración. Y representa el oficial del objeto.
Ejemplo:
>>> 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)''
Del resultado vemos que repr () muestra la representación oficial del objeto de fecha.
>>> x = ''foo''
>>> x
''foo''
Entonces, el nombre x
está adjunto a ''foo''
cadena ''foo''
. Cuando llama, por ejemplo, repr(x)
el intérprete pone ''foo''
lugar de x
y luego llama a repr(''foo'')
.
>>> repr(x)
"''foo''"
>>> x.__repr__()
"''foo''"
repr
realidad llama a un método mágico __repr__
de x
, que le da a la cadena que contiene la representación del valor ''foo''
asignado a x
. Entonces, devuelve ''foo''
dentro de la cadena ""
da como resultado "''foo''"
. La idea de repr
es dar una cadena que contiene una serie de símbolos que podemos escribir en el intérprete y obtener el mismo valor que se envió como argumento a repr
.
>>> eval("''foo''")
''foo''
Cuando llamamos a eval("''foo''")
, es lo mismo que ''foo''
en el intérprete. Es como escribimos directamente los contenidos 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 a eval(''foo'')
, es lo mismo que foo
en el intérprete. Pero no hay ninguna variable foo
disponible y se foo
una excepción.
>>> str(x)
''foo''
>>> x.__str__()
''foo''
>>>
str
es solo la representación de cadena del objeto (recuerda, la variable x
hace referencia a ''foo''
), por lo que esta función devuelve una cadena.
>>> str(5)
''5''
La representación de cadena del número entero 5
es ''5''
.
>>> str(''foo'')
''foo''
Y la cadena de representación de la cadena ''foo''
es la misma cadena ''foo''
.