TypeError: __str__ devolvió una salida de impresión pero no de cadena
- Python devolvió un error que no es una cadena pero imprimió la salida
-
Resolver TypeError:
__str__
devuelto sin cadena -
__str__
Devolvió una no cadena con__repr__()
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)
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.
LinkedInArtículo relacionado - Python Error
- Administrar fallas de segmentación en Python
- Archivo <Stdin>, Línea 1, en <Módulo> Error en Python
- Arreglar AttributeError: el objeto 'generador' no tiene atributo 'siguiente' en Python
- Arreglar el comando cl.exe falló: no existe tal archivo o directorio en Windows
- Arreglar NameError: la variable no está definida en Python
- Arreglar Socket.Gaierror: [Errno 8] Nodename ni Servname proporcionado, o desconocido en Python