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

¿Fue útil?

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:

  1. que b es una instancia de la clase A en el __main__ espacio de nombres,
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top