TypeError: __str__ は非文字列を返しましたが、印刷出力を返しました

Salman Mehmood 2023年6月21日
  1. Python は文字列以外のエラーを返しましたが、出力を印刷しました
  2. TypeError の解決: __str__ が非文字列を返す
  3. __str__ __repr__() で非文字列を返しました
TypeError: __str__ は非文字列を返しましたが、印刷出力を返しました

この記事は、関数で return ステートメントを使用する代わりに文字列を出力しようとしたときに発生する問題を解決することを目的としています。

Python は文字列以外のエラーを返しましたが、出力を印刷しました

次のコードは TypeError を示しています: __str__ は非文字列を返しましたが、それでも出力が出力されます。

コード例:

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)

出力:

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)

__str__ が非文字列 (NoneType 型) を返すなどのエラーが発生するのはなぜですか? まず、__str__ 演算子の働きを理解する必要があります。

__str__ 演算子は主に文字列を返すように設計されていますが、主に文字列を出力するために使用します。 Python の __str__ には 2つの用語があり、同じ意味で使用されます。演算子または Dunder メソッドです。

上記のコードでは、__str__ メソッドは print() 関数を直接呼び出して文字列を出力しますが、文字列を返しません。 そのため、上記のエラーが表示されます。

さらに、__str__ 演算子は文字列を出力し、何も返しません。 そのため、誤って None を使用しています。

TypeError の解決: __str__ が非文字列を返す

この問題は、__str__ メソッドの return ステートメントを使用して解決できます。 したがって、出力する代わりに __str__ メソッドで文字列を返す必要があります。 次のコードを参照してください。

コード例:

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)

出力:

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

上記のコードには、もう 1つ問題があります。 問題は、返される値が文字列でない場合、正確なエラーが表示されることですが、今回は変数の型が None ではありません。

コード例:

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)

出力:

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)

これを解決するには、値を型キャストし、それを str() メソッドでラップする必要があります。これは、str メソッドの要件であるため、変数の型を文字列に変換することを意味します。

コード例:

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)

出力:

123

予想されるすべての問題を解決し、str メソッドの要件を満たしたため、コードは考えられるすべてのケースで実行されます。つまり、文字列値のみを返します。

__str__ __repr__() で非文字列を返しました

__repr__() メソッドは str メソッドと同じことを行います。 次のコードを参照してください。

コード例:

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)

出力:

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

上記のコードは、__repr__() メソッドから文字列を返す代わりに、文字列も出力します。 したがって、__repr__() メソッドを使用して文字列を出力する代わりに、return ステートメントを使用して解決できます。

コード例:

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)

出力:

(1, 2, 3)
著者: Salman Mehmood
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

関連記事 - Python Error