제너레이터는 함수를 끝내지 않은 상태에서 yield를 사용하여 값을 바깥으로 전달할 수 있습니다. 즉, return은 반환 즉시 함수가 끝나지만 yield는 잠시 함수 바깥의 코드가 실행되도록 양보하여 값을 가져가게 한 뒤 다시 제너레이터 안의 코드를 계속 실행하는 방식입니다.
제너레이터가 다시 호출되면 이전까지 실행한 yield 줄부터 시작한다.
컨텍스트 매니저를 데코레이터로도 사용할 수 있도록 하는 베이스 클래스.
함수에 데코레이터로 적용된 컨텍스트 매니저는 함수 전체 범위에 적용된다.
This change is just syntactic sugar for any construct of the following form:
**def** f():
**with** cm():
*# Do stuff*
ContextDecorator
lets you instead write:
@cm()
**def** f():
*# Do stuff*
It makes it clear that the cm
applies to the whole function, rather than just a piece of it (and saving an indentation level is nice, too).
이 함수는 클래스나 별도의 __enter__()
와 __exit__()
메서드를 작성할 필요 없이, with
문 컨텍스트 관리자를 위한 팩토리 함수를 정의하는 데 사용할 수 있는 데코레이터입니다.
contextmanager()
는 내부적으로 ContextDecorator
를 사용하므로 with 문 뿐만 아니라 함수에 데코레이터를 다는 방식으로 함수 전체 범위에 컨텍스트 매니저를 적용할 수 있습니다.
from contextlib import contextmanager
@contextmanager
def managed_resource(*args, **kwds):
# Code to acquire resource, e.g.:
resource = acquire_resource(*args, **kwds)
try:
yield resource
finally:
# Code to release resource, e.g.:
release_resource(resource)
이 함수는 아래와 같이 사용됩니다.
with managed_resource(timeout=3600) as resource:
# Resource is released at the end of this block,
# even if code in the block raises an exception
위 코드는 아래 순서로 실행된다.