次のコードは をスローしRuntimeError: maximum recursion depth exceeded while getting the str of an object
ます。無限再帰は 2 つの異なる方法で解決できますが、それぞれの修正が機能する理由が理解できないため、どちらを使用すればよいのか、またはどちらが正しいのかわかりません。
class FileError( Exception ):
def __init__( self, filename=None, *a, **k ):
#Fix 1: remove super
super( FileError, self ).__init__( self, *a, **k )
self.filename = filename
def __repr__( self ):
return "<{0} ({1})>".format( self.__class__.__name__, self.filename )
#Fix 2: explicitly define __str__
#__str__ = __repr__
print( FileError( "abc" ) )
を削除するsuper
と、コードは実行されますが、何も出力されません。この投稿によると、 Python での __str__ と __repr__ の違い、省略__str__
は呼び出されるため、これは意味__repr__
がありませんが、ここでは発生していないようです。
代わりに、呼び出しを保持しsuper
て追加すると__str__ = __repr__
、期待される出力が得られ、再帰はありません。
無限再帰が存在する理由、各変更が無限再帰を解決する理由、およびある修正が他の修正よりも優先される理由を誰かが説明できますか?