Q & A

코루틴 초기화를 자동화할 수 없나요?

코루틴 객체를 생성한 뒤 next를 호출하는 모양이 마음에 들지 않는다면 다음과 같이 코루틴 초기화 데코레이터를 만들어서 사용하면 됩니다. 즉, 데코레이터 안에서 코루틴 객체를 만들고 next를 호출한 뒤 객체를 반환합니다(데코레이터는 Unit 44 데코레이터 사용하기' 참조).

coroutine_decorator.py

def coroutine(func):    # 코루틴 초기화 데코레이터
    def init(*args, **kwargs):
        co = func(*args, **kwargs)    # 코루틴 객체 생성
        next(co)                      # next 호출
        return co                     # 코루틴 객체 반환
    return init
 
@coroutine    # 코루틴 초기화 데코레이터 지정
def sum_coroutine():
        total = 0
        while True:
            x = (yield total)
            total += x
 
co = sum_coroutine()    # 코루틴 객체를 생성한 뒤 바로 사용
 
print(co.send(1))
print(co.send(2))
print(co.send(3))

실행 결과

1
3
6