Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

318
Vistas
¿Por qué imprime (t) el error si t.__str__() devuelve una cadena, pero no imprime (t.__str__())?

Estoy tratando de entender el método __str__ en Python.

 class Test: def __str__(self): return 5 t = Test() print(t.__str__())

En este método, devuelve un valor entero, pero el método de impresión puede imprimirlo.

Pero, cuando probé print(t) arrojó el error TypeError: __str__ returned non-string (type int) .

Según tengo entendido, print(t) también está llamando al __str__(self) .

¿Por qué print(t.__str__()) no quería la conversión de tipo de cadena?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Lo que estás haciendo es equivalente a print(5) , que funciona porque print llama a __str__ en 5 para obtener una cadena. Pero al pasar el objeto, print llama a __str__ en el objeto y no obtiene una cadena real en respuesta.

over 4 years ago · Santiago Trujillo Denunciar

0

Se trata de verificaciones adicionales que hace Python con algunas funciones integradas .

 len() --> __len__() + some checks str() --> __str__() + some checks

¡Hay una diferencia entre cuando "usted" llama a un método explícitamente o cuando ese método es llamado "por Python"! El punto es que cuando Python llame a su método, hará algunas comprobaciones por usted. (Esa es una de las razones por las que deberíamos usar esas funciones integradas en lugar de llamar al método dunder relevante).

Podemos ver ese comportamiento con len() y __len__() también:

 class Test: def __len__(self): return 'foo' t = Test() print(t.__len__()) # fine print(len(t)) # TypeError: 'str' object cannot be interpreted as an integer

¡Entonces python verificó el retorno de un entero en la segunda declaración de impresión! eso es lo que se esperaba de __len__() .

Lo mismo sucede aquí. Cuando llamas a print(t) , Python mismo llama al método __str__() , por lo que verifica si __str__() devuelve una cadena que se esperaba o no. (Lo mismo sucede con str(t) )

Pero, cuando dices print(t.__str__()) , primero, estás llamando a su método __str__() en la instancia explícitamente por ti mismo, no hay verificación aquí... ¿qué se devuelve? número 5 , y luego python ejecutará print(5) .

over 4 years ago · Santiago Trujillo Denunciar

0

Cuando llama a t.__str__() directamente, es como cualquier otro método. El método __str__ se sobrescribió, por lo que no tiene nada de especial al llamarlo directamente.

Cuando se realiza la invocación de print(t) internamente, donde se realiza una verificación de tipos

 if (!PyUnicode_Check(res)) { _PyErr_Format(tstate, PyExc_TypeError, "__str__ returned non-string (type %.200s)", Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL;

El manual dice:

El valor de retorno debe ser un objeto de cadena.

así que deberías hacer algo como

 def __str__(self): return str(5)

o mejor, algo más significativo como

 def __str__(self) -> str: return "TestObject with id: {}".format(self.id)

(El tipo de devolución se puede agregar a la declaración de la función para que su editor le informe si no tiene el tipo correcto).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda