yield

파이썬 코딩 도장

제너레이터는 함수를 끝내지 않은 상태에서 yield를 사용하여 값을 바깥으로 전달할 수 있습니다. 즉, return은 반환 즉시 함수가 끝나지만 yield는 잠시 함수 바깥의 코드가 실행되도록 양보하여 값을 가져가게 한 뒤 다시 제너레이터 안의 코드를 계속 실행하는 방식입니다.

제너레이터가 다시 호출되면 이전까지 실행한 yield 줄부터 시작한다.

ContextDecorator

컨텍스트 매니저를 데코레이터로도 사용할 수 있도록 하는 베이스 클래스.

함수에 데코레이터로 적용된 컨텍스트 매니저는 함수 전체 범위에 적용된다.

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).

contextmanager()

이 함수는 클래스나 별도의 __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

위 코드는 아래 순서로 실행된다.

  1. with 문이 컨텍스트 매니저로 꾸며진 함수(제너레이터)를 호출한다.