TypeError: __str__ devolvió una salida de impresión pero no de cadena

Salman Mehmood 21 junio 2023
  1. Python devolvió un error que no es una cadena pero imprimió la salida
  2. Resolver TypeError: __str__ devuelto sin cadena
  3. __str__ Devolvió una no cadena con __repr__()
TypeError: __str__ devolvió una salida de impresión pero no de cadena

Este artículo tiene como objetivo resolver el problema que ocurre cuando intentamos imprimir la cadena en lugar de usar una declaración de retorno en la función.

Python devolvió un error que no es una cadena pero imprimió la salida

El siguiente código muestra el TypeError: __str__ no devolvió una cadena, pero aún imprime la salida.

Código de ejemplo:

class xy:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        print("X={0}, Y={1}")


if __name__ == "__main__":
    x_y = xy("value of x is 1", "value of y is 2")
    print(x_y)

Producción :

TypeError                                 Traceback (most recent call last)
<ipython-input-1-7b40a083df6c> in <module>
     10 if __name__ == "__main__":
     11     x_y = xy('value of x is 1','value of y is 2')
---> 12     print(x_y)

TypeError: __str__ returned non-string (type NoneType)

¿Por qué recibimos un error, es decir, __str__ no devolvió una cadena (tipo NoneType)? Primero, necesitamos entender el funcionamiento del operador __str__.

El operador __str__ está diseñado principalmente para devolver la cadena, pero lo usamos principalmente para imprimir la cadena. Hay dos términos para __str__ en Python, que se usan indistintamente, operador o método Dunder.

En el código anterior, el método __str__ llama directamente a la función print() e imprime la cadena pero no devuelve una cadena; es por eso que está mostrando el error anterior.

Además, nuestro operador __str__ imprime la cadena y no devuelve nada; es por eso que usa Ninguno por error.

Resolver TypeError: __str__ devuelto sin cadena

Podemos resolver este problema usando la declaración de retorno en el método __str__. Entonces, debemos devolver la cadena en el método __str__ en lugar de imprimirla. Consulte el siguiente código.

Código de ejemplo:

class xy:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return ("X={0}, Y={1}").format(self.x, self.y)


if __name__ == "__main__":
    x_y = xy("value of x is 1", "value of y is 2")
    print(x_y)

Producción :

X=value of x is 1, Y=value of y is 2

El código anterior tiene un problema más. Y el problema es que si el valor que estamos devolviendo no es una cadena, mostrará el error exacto, pero esta vez, el tipo de variable no es Ninguno.

Código de ejemplo:

class xy:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return 123


if __name__ == "__main__":
    x_y = xy("value of x is 1", "value of y is 2")
    print(x_y)

Producción :

TypeError                                 Traceback (most recent call last)
<ipython-input-9-173c41d63dab> in <module>
     12 if __name__ == "__main__":
     13     x_y = xy('value of x is 1','value of y is 2')
---> 14     print(x_y)

TypeError: __str__ returned non-string (type int)

Para resolverlo, necesitamos encasillar el valor y envolverlo con el método str(), lo que significa convertir el tipo de la variable a cadena como es el requisito del método str.

Código de ejemplo:

class xy:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return str(123)


if __name__ == "__main__":
    x_y = xy("value of x is 1", "value of y is 2")
    print(x_y)

Producción :

123

Ahora, el código se ejecuta para todos los casos posibles porque solucionamos todos los problemas esperados y cumplimos con los requisitos del método str, es decir, solo devuelve el valor de la cadena.

__str__ Devolvió una no cadena con __repr__()

El método __repr__() hace lo mismo que el método str. Consulte el siguiente código.

Código de ejemplo:

class calculate(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        print("(%r, %r, %r)" % (self.x, self.y, self.z))


equation = calculate(1, 2, 3)
print(equation)

Producción :

(1, 2, 3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-0ee74d4c74c8> in <module>
      8 
      9 equation = calculate(1, 2, 3)
---> 10 print(equation)

TypeError: __str__ returned non-string (type NoneType)

El código anterior también imprime la cadena en lugar de devolverla desde el método __repr__(). Por lo tanto, podemos resolverlo usando la instrucción return en lugar de imprimir la cadena usando el método __repr__().

Código de ejemplo:

class calculate(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return str("(%r, %r, %r)" % (self.x, self.y, self.z))


equation = calculate(1, 2, 3)
print(equation)

Producción :

(1, 2, 3)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Python Error