¿Cuál es la diferencia entre __str__ y __repr__?

Alex lo resume muy bien, pero sorprendentemente es demasiado conciso.

Primero, para repetir el punto de la publicación de Alex.

  • La implementación predeterminada es inútil (es difícil pensar qué no lo es, pero lo es)
  • __repr__ el objetivo es claro
  • __str__ El objetivo es facilitar la lectura.
  • envase __str__ Usar objetos contenidos __repr__

La implementación por defecto es inútil.

Recomendado: framework en python

Esto es casi sorprendente, ya que los valores predeterminados de Python tienden a ser bastante convenientes.Sin embargo, en este caso, el valor predeterminado es __repr__ Así es como funciona:

return "%s(%r)" % (self.__class__, self.__dict__)

Es demasiado peligroso (por ejemplo, es fácil entrar en recursividad infinita si los objetos se referencian entre sí). Entonces Python lo maneja. Tenga en cuenta que hay un valor predeterminado que es correcto. __repr__ Se define como, __str__ De lo contrario, el objeto es como __str__=__repr__.

Entonces, en pocas palabras, casi todos los objetos que implementa necesitan funcionalidad. __repr__ Esto se puede usar para comprender objetos.implementar __str__ es una opción Ejecútelo cuando necesite la función de impresión limpia (por ejemplo, en un generador de informes).

Objetivo __repr__ para aclarar

Vamos ahora, no confío en los depuradores. No sé cómo usar el depurador, así que no lo he usado en serio. Además, creo que el principal inconveniente de los depuradores es su naturaleza fundamental. La mayoría de los errores que arreglo ocurrieron en galaxias distantes hace mucho tiempo. Esto significa que tengo fervor religioso y creo en la tala.

Recomendado: Preguntas entrevista python

El registro es la piedra angular de un sistema de servidor decente «dispara y olvida». Puede documentarlo fácilmente usando Python. Con el empaquetado específico del proyecto, todo lo que necesita es

log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)

Sin embargo, debe completar el último paso. Asegúrese de que cada objeto que implemente tenga una representación útil. De esa manera, un código como este funcionará bien. Es por eso que la «evaluación» está descartada. Si tiene suficiente información eval(repr(c))==cSignifica que sabes todo lo que necesitas saber. c..si es lo suficientemente fácil, al menos hágalo de manera ambigua. Si no lo es, asegúrese de tener suficiente información c Actualmente. Usualmente uso un formato como eval. "MyClass(this=%r,that=%r)" % (self.this,self.that).. no significa que realmente puedas construir MyClass, o que sean los parámetros correctos del constructor, pero es una buena manera de decir «eso es todo lo que necesitas saber sobre esta instancia».

Nota: yo usé %r no por encima %s.. Siempre quise usar repr() [or %r formatting character, equivalently] dentro __repr__ implementación, o rompes el propósito de repr. Desearía poder distinguir MyClass(3) cuando MyClass("3").

Recomendado: Árboles de decisión en Python con Scikit-Learn

Objetivo __str__ hacer que sea más fácil de leer

Específicamente, esto no es para aclarar, tenga cuidado. str(3)==str("3")..también si está implementando una abstracción de IP, puede hacer que str parezca 192.168.1.1. Al implementar la abstracción de fecha/hora, str será algo así como «2010/4/12 15:35:22». El objetivo es expresarlo de una manera que el usuario quiera leer, no el programador. Deshazte de los números innecesarios y finge ser otra clase; siempre que sea compatible con la legibilidad, es una mejora.

envase __str__ Usar objetos contenidos __repr__

Es sorprendente. un poco, __str__??

[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]

no mucho. Específicamente, resulta que las cadenas dentro de un contenedor pueden interferir fácilmente con su representación como una cadena. Recuerde, frente a la ambigüedad, Python resiste la tentación de adivinar. Si necesita el comportamiento anterior al imprimir la lista,

print("[" + ", ".join(l) + "]")

(Quizás también pueda entender cómo se manejan los diccionarios.

Percepción

incorporado __repr__ Clase para la implementación. Esta debería ser la segunda propiedad. Embedded __str__ Útil si encuentra la versión de cadena con errores de legibilidad.

¿ Te fue útil este artículo ?
⬇️ Ayudame compartiendo para poder llegar a más personas.⬇️