파이썬, 데코레이터 패턴으로 함수 호출 전후 반복 행동을 처리하기

 

글. 수알치 오상문 

 

파이썬에서 제공 데코레이터 패턴을 이용하면,

함수를 호출했을 때  전후 또는 결과 값을 처리할 반복적인 행동을 처리하는 패턴을 간편하게 만들 수 있다.

 

다음은 3개 함수를 호출할 때 공통으로 처리할 기능을 데코레이터 패턴으로 처리한 예제이다.

 

# 파이썬 데코레이터 패턴 예제
import time

 

# 함수 호출 전후에 공통으로 처리할 데코레이터 함수 정의 
def trace(func):
    def wrapper():
        print('\n' + func.__name__ + ' 작업을 시작합니다')
        start = time.time()
        ret = func()
        print('return:', ret)
        print("걸린 시간: %.3f" %(time.time()-start))
        print(func.__name__, '작업을 종료합니다')
    return wrapper

 

@trace  # 데코레이터 지정
def greets1():
    time.sleep(1)
    # print('greets1')
    return 1

@trace  # 데코레이터 지정
def greets2():
    time.sleep(2)    
    # print('greets2')
    return 2

@trace  # 데코레이터 지정
def greets3():
    time.sleep(3)    
    # print('greets3')
    return 3

func = [greets1, greets2, greets3]  #  함수 리스트 

 

# 함수 리스트에 있는 함수를 하나씩 호출
for fn in func:
    fn()

 

 

[실행 결과]


greets1 작업을 시작합니다
return: 1
걸린 시간: 1.033
greets1 작업을 종료합니다

greets2 작업을 시작합니다
return: 2
걸린 시간: 2.030
greets2 작업을 종료합니다

greets3 작업을 시작합니다
return: 3
걸린 시간: 3.034
greets3 작업을 종료합니다

 

 

[참고] 다른 예제 (크롤링 작업 시 중복 부분을 데코레이터로 처리한 경우)

def browser():
    service = Chromedriver(binary='/Users/baekchangmyeong/chromedriver')
    browser = Chrome()
    def wrapper(func):
        @functools.wraps(func)
        async def wrapped():
            async with get_session(service, browser) as session:
                copy_func = functools.partial(func, session=session)
                return await copy_func()
        return wrapped
    return wrapper
@browser()
async def naver(session):
    await session.get('https://www.naver.com/')
    button = await session.get_element('button[id="search_btn"]')
    input = await session.get_element('input[id="query"]')
    await input.send_keys('검색 테스트')
    await button.click()
    html = await session.get_text()
    print(html)

출처: https://changmyeong.tistory.com/49 

 

 

반응형

+ Recent posts