Propósito de __repr__ de Python

def __repr__(self): return '' % ( 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?

__repr__ debería devolver una representación imprimible del objeto, probablemente una de las formas posibles de crear este objeto. Consulte la documentación oficial aquí . __repr__ es más para los desarrolladores, mientras que __str__ es para los usuarios finales.

Un ejemplo simple:

 >>> 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) 

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 produciría un objeto con el mismo valor cuando se pasa a eval (); de lo contrario, la representación es una cadena encerrada entre paréntesis angulares que contiene el nombre del tipo de objeto. con información adicional que a menudo incluye el nombre y la dirección del objeto. Una clase puede controlar lo que esta función devuelve para sus instancias definiendo un método __repr __ ().

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

__repr__ es utilizado por el intérprete de Python independiente 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 '' ... >>> demo = StackOverflowDemo() >>> demo  

En los casos en que un método __str__ no esté definido en la clase, llamará a la función __repr__ en un bash de crear una representación imprimible.

 >>> str(demo) '' 

Además, print() la clase llamará __str__ de forma predeterminada.


Documentación , por favor.

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

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__ para un valor de str 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 un argumento para evaluar, el resultado no será válido.

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 es “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 su lugar, se ejecutan automáticamente bajo circunstancias específicas.

Es conveniente poder generar el valor de una instancia de un objeto utilizando una statement de impresión. Cuando hagamos esto, nos gustaría que el valor se represente en la salida en un formato comprensible e inequívoco. El método especial de repr puede utilizarse para hacer 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 cual definimos este método. Debe mencionarse, sin embargo, que también hay un método especial de str , 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, el método repr para la clase Point3D, y hemos instanciado my_point como una instancia de Point3D, y luego hacemos esto …

imprimir my_point … podemos ver esto como la salida …

No es muy agradable, ¿eh?

Por lo tanto, definimos el método especial repr o str , o ambos, para obtener una mejor salida.

 **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)

Implementar repr para cada clase que implementes. No debería haber excusa. Implementa str para las clases que crees que la legibilidad es más importante que la no ambigüedad.

Consulte este enlace: https://www.pythoncentral.io/what-is-the-difference-between- str -y- repr -in-python /