TypeError: __str__ Nicht-String zurückgegeben, aber Ausgabe gedruckt

Salman Mehmood 21 Juni 2023
  1. Python hat einen Non-String-Fehler zurückgegeben, aber die Ausgabe gedruckt
  2. TypeError auflösen: __str__ Nicht-String zurückgegeben
  3. __str__ Zurückgegebener Nicht-String mit __repr__()
TypeError: __str__ Nicht-String zurückgegeben, aber Ausgabe gedruckt

Dieser Artikel zielt darauf ab, das Problem zu lösen, das auftritt, wenn wir versuchen, die Zeichenfolge zu drucken, anstatt eine return-Anweisung in der Funktion zu verwenden.

Python hat einen Non-String-Fehler zurückgegeben, aber die Ausgabe gedruckt

Der folgende Code zeigt den TypeError: __str__ gab keinen String zurück, druckt aber trotzdem die Ausgabe.

Beispielcode:

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)

Ausgang:

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)

Warum erhalten wir einen Fehler, d. h. __str__ gibt einen Nicht-String zurück (Typ NoneType)? Zuerst müssen wir die Funktionsweise des Operators __str__ verstehen.

Der Operator __str__ ist in erster Linie darauf ausgelegt, den String zurückzugeben, aber wir verwenden ihn meistens, um den String auszugeben. Es gibt zwei Begriffe für __str__ in Python, die synonym verwendet werden, Operator oder Dunder-Methode.

Im obigen Code ruft die Methode __str__ direkt die Funktion print() auf und gibt den String aus, gibt aber keinen String zurück; Deshalb zeigt es den obigen Fehler.

Außerdem gibt unser Operator __str__ den String aus und gibt nichts zurück; Deshalb wird fälschlicherweise None verwendet.

TypeError auflösen: __str__ Nicht-String zurückgegeben

Wir können dieses Problem mit der return-Anweisung in der Methode __str__ lösen. Also müssen wir den String in der Methode __str__ zurückgeben, anstatt ihn auszugeben. Siehe folgenden Code.

Beispielcode:

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)

Ausgang:

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

Der obige Code hat ein weiteres Problem. Und das Problem ist, wenn der Wert, den wir zurückgeben, kein String ist, wird der genaue Fehler angezeigt, aber diesmal ist der Variablentyp nicht None.

Beispielcode:

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)

Ausgang:

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)

Um es zu lösen, müssen wir den Wert typisieren und mit der Methode str() umschließen, was bedeutet, dass der Typ der Variablen in einen String konvertiert wird, da dies die Anforderung der Methode str ist.

Beispielcode:

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)

Ausgang:

123

Jetzt läuft der Code für alle möglichen Fälle, weil wir alle erwarteten Probleme gelöst und die Anforderungen der str-Methode erfüllt haben, d.h. sie gibt nur den String-Wert zurück.

__str__ Zurückgegebener Nicht-String mit __repr__()

Die Methode __repr__() macht dasselbe wie die Methode str. Siehe folgenden Code.

Beispielcode:

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)

Ausgang:

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

Der obige Code gibt auch die Zeichenfolge aus, anstatt sie von der Methode __repr__() zurückzugeben. Daher können wir es lösen, indem wir die return-Anweisung verwenden, anstatt den String mit der __repr__()-Methode auszugeben.

Beispielcode:

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)

Ausgang:

(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

Verwandter Artikel - Python Error