Propósito de la __repr__ de Python

139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

¿Cuál es el significado / propósito de este método?

zjm1126
fuente
@ zjm1126: ¿quiere saber por qué >>> variableimprime lo que __repr__()devuelve?
Esteban Küber
19
Esa documentación pone a las personas a dormir. Además, es útil aprender de otros cómo se usa esto.
Concerned_Citizen
Posible duplicado de la diferencia entre __str__ y __repr__ en Python
Vlad Bezden
2
Para los desarrolladores de Java que están aprendiendo Python, la mejor manera de ver esto es toString () en Java.
Ravi

Respuestas:

189

__repr__debería devolver una representación imprimible del objeto, probablemente una de las formas posibles de crear este objeto. Ver documentación oficial aquí . __repr__es más para desarrolladores mientras__str__ para usuarios finales.

Un simple ejemplo:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
perezoso1
fuente
2
lazy1: principalmente quería arreglar el formato (es útil que los ejemplos coincidan lo más posible con lo que verán en una sesión de muestra), pero también modifiqué el formato de salida para que sea explícitamente diferente de la asignación, ya que Mejora enormemente la claridad para alguien confundido sobre esto, en mi humilde opinión. (Si he ido demasiado lejos, solo vuelva a editar, y le debo una cerveza.)
1
Tal vez debería usar% r en lugar de% s: stackoverflow.com/questions/6005159/…
Jonathan Adelson el
43
Esto no es realmente correcto. __str__es la salida que se supone que es legible por humanos: __repr__se supone que es una representación legible para el intérprete de Python (es decir, alimentar la cadena al intérprete debería recrear el objeto). Si un objeto no tiene un __str__método, sin embargo, __repr__se usa en su lugar. También como se señaló: este ejemplo en realidad imprime el __str__método de self.xy self.y: %rdebe usarse en lugar de %sen la operación de formateo de cadenas (dado que la clase no define __str__, en __repr__realidad se devuelve de todos modos, pero es una anomalía).
Daniel Andersson
20

Esto se explica bastante bien en la documentación de Python :

repr ( objeto ): devuelve una cadena que contiene una representación imprimible de un objeto. Este es el mismo valor producido por las conversiones (comillas inversas). A veces es útil poder acceder a esta operación como una función ordinaria. Para muchos tipos, esta función intenta devolver una cadena que arrojaría un objeto con el mismo valor cuando se pasa eval(), de lo contrario, la representación es una cadena entre corchetes angulares que contiene el nombre del tipo de objeto junto con información adicional a menudo incluye el nombre y la dirección del objeto. Una clase puede controlar lo que devuelve esta función para sus instancias definiendo un __repr__()método.

Entonces, lo que está viendo aquí es la implementación predeterminada de __repr__, que es útil para la serialización y la depuración.

dmazzoni
fuente
55
Creo que el método de comillas inversas (o 'backticks') para obtener la "representación" de un objeto está en desuso y se eliminó para la versión 3.0
MatrixFrog
MatrixFrog: ambos son ciertos, pero la documentación actual de 2.x todavía dice esto, de donde proviene la cita.
Para muchos objetos, __repr__ y __str__ son la misma función. De hecho, si solo define __str__, entonces __repr__ por defecto solo llama a __str__. El caso más obvio donde esto no es cierto son las cadenas en sí mismas: str ('stackoverflow') regresa stackoverflowpero repr ('stackoverflow') sí 'stackoverflow'.
MatrixFrog
66
Tienes eso al revés, __repr__ nunca usa __str__, pero puede ocurrir lo contrario. Ver docs.python.org/reference/…
13

__repr__es utilizado por el intérprete independiente de Python para mostrar una clase en formato imprimible. Ejemplo:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

En los casos en que un __str__método no esté definido en la clase, llamará a la __repr__función en un intento de crear una representación imprimible.

>>> str(demo)
'<StackOverflow demo object __repr__>'

Además, print()la clase llamará __str__por defecto.


Documentación , por favor.


fuente
7

El método __repr__ simplemente le dice a Python cómo imprimir objetos de una clase

Jasper Kinoti
fuente
1

Un ejemplo para ver las diferencias entre ellos (copié de esta fuente ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

Los retornos de repr()y str()son idénticos para int x, pero hay una diferencia entre los valores de retorno para str y: uno es formal y el otro es informal . Una de las diferencias más importantes entre las representaciones formales e informales es que la implementación predeterminada de __repr__un valor de cadena se puede llamar como un argumento para evaluar, y el valor de retorno sería un objeto de cadena válido, como este:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Si intenta llamar al valor de retorno de __str__como argumento para evaluar, el resultado no será válido.

Anh-Thi DINH
fuente
1

Cuando creamos nuevos tipos definiendo clases, podemos aprovechar ciertas características de Python para hacer que las nuevas clases sean convenientes de usar. Una de estas características son los "métodos especiales", también conocidos como "métodos mágicos".

Los métodos especiales tienen nombres que comienzan y terminan con dos guiones bajos. Los definimos, pero generalmente no los llamamos directamente por su nombre. En cambio, se ejecutan automáticamente en circunstancias específicas.

Es conveniente poder generar el valor de una instancia de un objeto mediante el uso de una declaración de impresión. Cuando hacemos esto, nos gustaría que el valor se represente en la salida en un formato inequívoco y comprensible. El método especial repr se puede utilizar para organizar que esto suceda. Si definimos este método, se puede llamar automáticamente cuando imprimimos el valor de una instancia de una clase para la que definimos este método. Sin embargo, debe mencionarse que también hay un str método especial, utilizado para un propósito similar, pero no idéntico, que puede tener prioridad, si también lo hemos definido.

Si no lo hemos definido, la repr método para la clase Point3D, y hemos instanciado my_point como una instancia de Point3D, y luego hacemos esto ...

print my_point ... podemos ver esto como la salida ...

No muy bien, ¿eh?

Entonces, definimos el método especial repr o str , o ambos, para obtener un mejor resultado.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

Salida ...

(1, 2, 3) (1, 2, 3)

Ashish Anand
fuente