理解のあるPython
タグ(スペース区切り):Python
with
一種として上下文管理器
、Python
の役割は、を置き換えるために使用されるtry...except...finally
処理フローとして簡単に理解できます。
with
__enter__
メソッドを介して初期化し、その後__exit__
、余波を実行して、メソッド内の例外を処理します。これwith
は、事前に設定して後でクリーンアップする必要があるいくつかのタスクに非常に便利な表現を提供します。次のwith
ステートメントが評価された後、オブジェクト__enter__
を返すメソッドが呼び出され、__enter__
返された結果がas
次の変数に割り当てられます。場合with
、次のコードブロックがすべて実行され、__exit__()
メソッドオブジェクトを返すために呼び出されるクリーンアップ作業を行います。
ファイル操作と同じように:
file = open("file.txt")
try:
data = file.read()
finally:
file.close()
使用後with...as...
、コードは次のように削減されます。
with open("file.txt") as file:
data = file.read()
上記のコードでは、open()
関数はandメソッドfile
を持つタイプのオブジェクトを返し(表示できます)、オブジェクトのメソッドを呼び出して戻り値を変数に割り当てるため、閉じる必要はありません。操作ファイルファイル使用時の表示。__enter__
__exit__
dir(file),type(file)
__enter__
file
with...as...
私たちが知っているので、with...as...
最も重要なことはある__enter
、__exit__
我々はコンテキストマネージャをカスタマイズできること
その中で:
__enter__
このメソッドは、コードブロックに入る前に呼び出されます。
__exit__
コードブロックを離れた後に呼び出されます(コードブロックで例外が発生した場合でも)。
class WithDemo:
def __enter__(self):
print "in __enter__"
return "WithDemo"
def __exit__(self, type, value, trace):
print "in __exit__"
def get_demo_with():
return WithDemo()
with get_demo_with() as demo:
print "demo:", demo
実行結果は次のとおりです。
in __enter__
demo:WithDemo
in __exit__
当初、with..as..
代わりtry...except...finally...
に使用できるプロセス操作、上記try...finally...
の状況、異常はどうでしょうか?注意深く見る__exit__()
と、3つのパラメーターがあります。これらの3つのパラメーターは、例外の処理を提供するパラメーターです。
class WithDemo:
def __enter__(self):
return self
def __exit__(self, type, value, trace):
print "type:", type
print "value:", value
print "trace:", trace
def create_trace(self):
return (1/10) + 10
with WithDemo() as demo:
demo.create_trace()
コードを実行すると、コードがタイプ、値、およびトレースを出力することがわかります。