ホームページ >バックエンド開発 >Python チュートリアル >Python の with ステートメントを理解する方法
with キーワードは Python 2.5 で追加されました。これは、try...excel...finally... パターンを置き換えるために使用されます。
with ステートメントはリソースにアクセスするときに使用されます。使用中に例外が発生したかどうかに関係なく、必要な「クリーニング」操作が実行され、リソースが解放されることを確認してください。たとえば、ファイルは使用後に自動的に閉じられ、スレッドのロックは自動的に取得および解放されます。
with EXPR [ as VAR ]: BLOCK 简单说明: 1,EXPR可以是任意表达式。 2,as VAR是可选的。 3,BLOCK是with语句的语句体
の構文形式について説明します:
1、EXPR を計算し、コンテキスト マネージャーを取得します。
2. コンテキストマネージャーの exit() メソッドは、後続の呼び出しのために保存されます。
3. コンテキストマネージャーの enter() メソッドを呼び出します
4. with 式に VAR が含まれている場合、EXPR の戻り値が VAR に割り当てられます。
5. BLOCK の式を実行します
6. コンテキストマネージャーの exit() メソッドを調整します。 BLOCK の実行中に例外が発生し、プログラムが終了した場合、例外の型、値、およびトレースバック (つまり、sys.exc_info() の戻り値) がパラメーターとして exit に渡されます。 () メソッドを実行すると、コンソールに例外がスローされます。それ以外の場合は、3 つの None 値が渡されます。
mgr = (EXPR) exit = type(mgr).__exit__ # 这里没有执行 value = type(mgr).__enter__(mgr) exc = True try: try: VAR = value # 如果有 as VAR BLOCK except: exc = False if not exit(mgr, *sys.exc_info()): raise finally: if exc: exit(mgr, None, None, None)
注:
1. コンテキストマネージャー enter() または exit() にメソッドがない場合、インタープリターは An をスローします。 AttributeError.
2、BLOCK で例外が発生した後、exit() メソッドが True とみなせる値を返した場合、この例外はスローされず、後続のコードは実行を継続します。
class my_name: def __enter__(self): print("调用__enter__()方法") return "xiaoke" def __exit__(self, type, value, trace): print("调用__exit__()方法") def get_name(): return my_name() with get_name() as name: print("my name is :", name) # 结果如下: # 调用__enter__()方法 # my name is : xiaoke # 调用__exit__()方法
class number: # with语句执行的时候调用 def __enter__(self): print("调用_enter_()方法") return self # with语句执行完毕,结束的时候调用 def __exit__(self, type, value, trace): print("type:", type) print("value:", value) print("trace:", trace) # 当有异常的时候,那么就不会有返回值 def do_number(self): num = 10 / 0 return num + 100with number()as result: res = result.do_number() print(res) # 结果如下: # 调用_enter_()方法 # type: <class 'ZeropisionError'> # value: pision by zero # trace: <traceback object at 0x00000224182AE388> # Traceback (most recent call last): # File "E:/pycharmProject/Test49.py", line 56, in <module> # res = result.do_number() # File "E:/pycharmProject/Test49.py", line 51, in do_number # num = 10 / 0 # ZeropisionError: pision by zero
官网代码:import asyncio async def coro(name, lock): print('coro {}: waiting for lock'.format(name)) async with lock: print('coro {}: holding the lock'.format(name)) await asyncio.sleep(1) print('coro {}: releasing the lock'.format(name)) loop = asyncio.get_event_loop() lock = asyncio.Lock() coros = asyncio.gather(coro(1, lock), coro(2, lock))try: loop.run_until_complete(coros)finally: loop.close()
出力コード:
coro 1: waiting for lock coro 1: holding the lock coro 2: waiting for lock coro 1: releasing the lock coro 2: holding the lock coro 2: releasing the lock
記事の参考文献は次のとおりです: 1. 公式 Web サイト: https://www.python.org/dev/peps/pep-0343/2
以上がPython の with ステートメントを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。