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)
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
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません