파이썬, 데코레이터 패턴으로 함수 호출 전후 반복 행동을 처리하기
글. 수알치 오상문
파이썬에서 제공 데코레이터 패턴을 이용하면,
함수를 호출했을 때 전후 또는 결과 값을 처리할 반복적인 행동을 처리하는 패턴을 간편하게 만들 수 있다.
다음은 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
'Python 기초' 카테고리의 다른 글
파이썬, 백그라운드 함수 실행 데코레이터 만들어 사용하기 (0) | 2022.07.31 |
---|---|
파이썬, 비동기 함수에서 동기 함수 호출하기 (0) | 2022.07.31 |
AttributeError: module 'collections' has no attribute 'Callable' (0) | 2022.07.30 |
파이썬, 동기식, 비동기식(구형/신형) 함수 사용 비교 예제 2 (0) | 2022.07.30 |
파이썬, 동기식, 비동기식(구형/신형) 함수 사용 비교 예제 (0) | 2022.07.29 |