web-dev-qa-db-ja.com

__exit__の戻り値

という事は承知しています

  • __enter__および__exit__は、コンテキストマネージャーを実装するために使用されます。

  • withステートメントで例外が発生した場合、例外のタイプ、値、およびトレースバックが__exit__メソッドに渡されます。

  • __exit__は例外を処理できます:

    1. 戻り値True:例外は適切に処理されます。
    2. それ以外のものを返す:withステートメントは例外を発生させます

次の__exit__メソッドに出くわしました。returnステートメントは冗長ですか?

def __exit__(self, type, value, traceback):
    self.close()
    return type == None

私にはそう思われるので、

  • 例外が発生しなかった場合、typeは当然Noneになるため、__exit__はtrueを返します。何も発生しません。
  • 例外が発生した場合、typeは実際の例外タイプに設定されるため、__exit__はfalseを返します。例外はそのまま発生します。
16
sam

はい、そのreturnステートメントは冗長です。 typenotNoneである場合にのみ、戻り値は重要です。

object.__exit__()ドキュメント から:

例外が提供され、メソッドが例外を抑制したい場合(つまり、例外が伝播されないようにしたい場合)、真の値を返す必要があります。それ以外の場合、例外はこのメソッドの終了時に通常どおり処理されます。

true値は例外を抑制することに注意してください。したがって、Trueだけでなく、1または"Handled!"も機能します。

そのreturn行を削除すると、代わりにNoneが返され、機能は変更されません。ただし、そのreturn type == Noneステートメントは複数のレベルで混乱するだけなので、読みやすさが向上します(たとえば、type is Noneを使用しないのはなぜですか?)。

16
Martijn Pieters