Cuando es la salida de repr útil?
Pregunta
He estado leyendo sobre repr
en Python. Me preguntaba lo que la aplicación de la salida de repr
es. por ejemplo.
class A:
pass
repr(A) ='<class __main__.A at 0x6f570>'
b=A()
repr(b) = '<__main__.A instance at 0x74d78>'
Cuando uno habría interesarle or'<class __main__.A at 0x6f570>'
'<__main__.A instance at 0x74d78>'
?
Solución
A veces hay que lidiar con o una cadena de bytes como
bob2='bob\xf0\xa4\xad\xa2'
Si imprime esto (en Ubuntu) se obtiene
In [62]: print(bob2)
bob𤭢
que no es muy útil a los demás tratando de entender su cadena de bytes. En los comentarios, John señala que en Windows, resultados print(bob2)
en algo así como bobð¤¢
. El problema es que Python detecta la codificación por defecto de su / consola y terminal de intentos para decodificar la cadena de bytes de acuerdo con esa codificación. Desde Ubuntu y Windows utiliza diferentes codificaciones predeterminadas (posiblemente utf-8
y cp1252
respectivamente), los diferentes resultados se deducen.
En contraste, la repr de una cadena es inequívoco:
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
Cuando la gente enviar preguntas aquí en SO acerca de las cadenas de Python, que a menudo se le preguntó para mostrar la repr de la cadena por lo que sabemos a ciencia cierta qué cadena se están tratando.
En general, la repr debería ser una representación de cadena inequívoca del objeto. repr(obj)
llama al método obj
del __repr__
objeto. Dado que en el ejemplo de la A
clase no tiene su propio método __repr__
, complejos y repr(b)
a lo que indica la dirección de la clase y la memoria.
Puede reemplazar el método __repr__
para dar información más relevante.
En su ejemplo, '<__main__.A instance at 0x74d78>'
nos dice dos cosas útiles:
- que
b
es una instancia de la claseA
en el__main__
espacio de nombres, - y que reside el objeto en memoria en la dirección 0x74d78.
Es posible que, por ejemplo, tiene dos instancias de A
clase. Si tienen la misma dirección de memoria entonces lo que saben que están "apuntando" al mismo objeto subyacente. (Tenga en cuenta esta información también puede obtenerse utilizando id
).
Otros consejos
En teoría, repr(obj)
debe escupir a cabo una cadena de tal manera que se puede introducir en eval
para volver a crear el objeto. En otras palabras,
obj2 = eval(repr(obj1))
debería reproducir el objeto.
En la práctica, repr
es a menudo una versión "light" de str
. str
podría imprimir un formulario legible por humanos del objeto, mientras que las impresiones repr
a cabo la información como la clase del objeto, por lo general para fines de depuración. Sin embargo, la utilidad depende mucho de su situación y la forma del objeto en cuestión asas repr
.
El objetivo principal de repr()
es que se utiliza en el intérprete interactivo y en el depurador de objetos de formato en forma legible por humanos. El ejemplo que dio es principalmente útil para propósitos de depuración.