という事は承知しています
__enter__
および__exit__
は、コンテキストマネージャーを実装するために使用されます。
with
ステートメントで例外が発生した場合、例外のタイプ、値、およびトレースバックが__exit__
メソッドに渡されます。
__exit__
は例外を処理できます:
True
:例外は適切に処理されます。with
ステートメントは例外を発生させます次の__exit__
メソッドに出くわしました。returnステートメントは冗長ですか?
def __exit__(self, type, value, traceback):
self.close()
return type == None
私にはそう思われるので、
type
は当然None
になるため、__exit__
はtrueを返します。何も発生しません。type
は実際の例外タイプに設定されるため、__exit__
はfalseを返します。例外はそのまま発生します。はい、そのreturnステートメントは冗長です。 type
がnotNone
である場合にのみ、戻り値は重要です。
例外が提供され、メソッドが例外を抑制したい場合(つまり、例外が伝播されないようにしたい場合)、真の値を返す必要があります。それ以外の場合、例外はこのメソッドの終了時に通常どおり処理されます。
true値は例外を抑制することに注意してください。したがって、True
だけでなく、1
または"Handled!"
も機能します。
そのreturn
行を削除すると、代わりにNone
が返され、機能は変更されません。ただし、そのreturn type == None
ステートメントは複数のレベルで混乱するだけなので、読みやすさが向上します(たとえば、type is None
を使用しないのはなぜですか?)。