with 키워드는 Python 2.5에서 추가되었습니다. try...out...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에 매개 변수로 전달됩니다. () 메서드를 사용한 다음 콘솔에 예외가 발생합니다. 그렇지 않으면 세 개의 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. 공식 홈페이지: https://www.python.org/dev/peps/pep-0343/2
위 내용은 Python에서 with 문을 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!