파이썬(Python) - 데코레이터(Decorator)
오늘은 지난 시간에 이어서 파이썬 데코레이터(Decorator) 패턴 및 wraps 사용 예제를 작성해보고
소스코드를 설명드리겠습니다.
데코레이터에 대한 정의는 특정 함수를 랩핑(wrapping) 후 추가적으로 기능을 추가하고 새로운
함수를 작성하는 역할이라고 볼 수 있습니다.
즉, 공통으로 항상 호출 되는 함수를 작성하거나, 특정 함수의 전/후에 실행가능한 기능을 추가하는 것
이라고 볼 수 있습니다.
데코레이터의 사용은 최대한 파이썬 문법(Pythonic)에 가깝게 작성 하고 공통적으로 코드를 쉽게 관리
및 가독성이 좋은 코드를 작성하기 위해서 사용합니다.
그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.
파이썬(Python) - 데코레이터(Decorator) 예제 문법(Syntax)
파이썬 데코레이터를 활용하면 실제로 소스 코드 실행 중에 다양한 기능을 수행 할 수 있고 직관적으로
가독성을 높여주는 효과가 있다고 볼 수 있습니다.
다만, 잦은 데코레이터의 사용은 코드를 난해하게 만들고 디버깅을 어렵게 하는 가능성이 있으니
본연의 기능에 맞는 위치에 사용하시는 게 좋을 것 같습니다.
아래 예제에서는 특히 wraps를 사용/미사용 의 경우에 대해서 정확하게 이해하셔야 합니다.
python_decorator1.py
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 from functools import wraps#파이썬 데코레이터 예제#wraps 사용 : 기존 정의한 함수 내 속성 유지#wraps 미사용 : 기존 정의한 함수 내 속성 유지 하지 않음#용도 : 특정 시점에 항상 실행되는 함수 정의 -> 로그, 통계성 데이터, 성능 테스트 등 def my_decorator1(func): def runs_func(): print("decorator1 - no use wrapper") func() return runs_func def my_decorator2(func): @wraps(func) def runs_func(): print("decorator2 - use wrapper") func() return runs_func @my_decorator1def my_func1(): ''' func attr text1 ''' print("my_func1 run!") @my_decorator2def my_func2(): ''' func attr text2 ''' print("my_func2 run!") #데코레이터 사용 함수 실행(wraps 미사용)my_func1()print("Func1 Name : ", my_func1.__name__)print("Func1 Doc : ", my_func1.__doc__) #구분선print('-' * 50) #데코레이터 사용 함수 실행(wraps 사용)my_func2()print("Func2 Name : ", my_func2.__name__)print("Func1 Doc : ", my_func2.__doc__) ##### 참고 자료 ##### #데코레이터 미사용 함수 실행(wraps 미사용)deco_my_func1 = my_decorator1(my_func1)deco_my_func1() #구분선print('-' * 50) #데코레이터 미사용 함수 실행(wraps 사용)deco_my_func2 = my_decorator1(my_func2)deco_my_func2() cs
- 1번 라인 : wraps 함수 import
wraps를 사용하지 않으면 외부에서 전달된 함수의 인자를 포함하고 있지 않습니다.
보통 클로저(Closure) : 내부(Inner)함수에서 외부(Outer)로 부터 전달 된 인자를 저장하는 개념에 대한
이해가 필요합니다.
- 7번 라인 : my_decorator1 함수 정의 : wraps 미사용
- 13번 라인 : my_decorator2 함수 정의 : wraps 사용
- 21, 28번 라인 : 데코레이터 실행 함수 정의(my_func1, my_func2)
my_func2() 실행의 경우 wraps 기능을 추가했으므로, 지역 스코프내에 인자(args)를 전부 출력
- 51, 58번 라인 : 데코레이터를 사용하지 않고 함수를 선언해서 사용하는 패턴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | from functools import wraps #파이썬 데코레이터 예제 #wraps 사용 : 기존 정의한 함수 내 속성 유지 #wraps 미사용 : 기존 정의한 함수 내 속성 유지 하지 않음 #용도 : 특정 시점에 항상 실행되는 함수 정의 -> 로그, 통계성 데이터, 성능 테스트 등 def my_decorator1(func): def runs_func(): print("decorator1 - no use wrapper") func() return runs_func def my_decorator2(func): @wraps(func) def runs_func(): print("decorator2 - use wrapper") func() return runs_func @my_decorator1 def my_func1(): ''' func attr text1 ''' print("my_func1 run!") @my_decorator2 def my_func2(): ''' func attr text2 ''' print("my_func2 run!") #데코레이터 사용 함수 실행(wraps 미사용) my_func1() print("Func1 Name : ", my_func1.__name__) print("Func1 Doc : ", my_func1.__doc__) #구분선 print('-' * 50) #데코레이터 사용 함수 실행(wraps 사용) my_func2() print("Func2 Name : ", my_func2.__name__) print("Func1 Doc : ", my_func2.__doc__) ##### 참고 자료 ##### #데코레이터 미사용 함수 실행(wraps 미사용) deco_my_func1 = my_decorator1(my_func1) deco_my_func1() #구분선 print('-' * 50) #데코레이터 미사용 함수 실행(wraps 사용) deco_my_func2 = my_decorator1(my_func2) deco_my_func2() | cs |
- 1번 라인 : wraps 함수 import
wraps를 사용하지 않으면 외부에서 전달된 함수의 인자를 포함하고 있지 않습니다.
보통 클로저(Closure) : 내부(Inner)함수에서 외부(Outer)로 부터 전달 된 인자를 저장하는 개념에 대한
이해가 필요합니다.
- 7번 라인 : my_decorator1 함수 정의 : wraps 미사용
- 13번 라인 : my_decorator2 함수 정의 : wraps 사용
- 51, 58번 라인 : 데코레이터를 사용하지 않고 함수를 선언해서 사용하는 패턴
파이썬(Python) - 데코레이터(Decorator) 예제 실행 화면
아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.
실제 실행 화면
마무리
이번 예제에서는 파이썬에서 자주 사용하는 데코레이터 패턴에 대해서 설명드렸습니다.
적절한 데코레이터 패턴의 사용은 파이썬 문법다운 코드 스타일을 유지 가능하게 하고 공통 실행 함수
작성을 통한 전체에서 실행되는 모듈 기능 구현을 손 쉽게 할 수 있도록 지원합니다.
보통은 로깅(Logging), 공통데이터 처리, 테스트(Test Case)기능 작성 등에 사용되고 있습니다.
다음 시간에도 파이썬 관련 유용한 주제에 대해서 포스팅 하도록 하겠습니다.
소스코드 다운로드 :
python_decorator1.zip
'언어 > Python' 카테고리의 다른 글
파이썬 아나콘다(Anaconda) - 심화 사용법 정리(2) - env 명령어 (2) | 2019.01.26 |
---|---|
파이썬 아나콘다(Anaconda) - 심화 사용법 정리(1) - list, search 명령어 (0) | 2019.01.23 |
파이썬(Python) - 람다(lambda)식 및 filter, reduce 사용 예제 및 소스코드 (0) | 2018.11.15 |
파이썬(Python) - 람다(lambda)식 및 map 사용 예제 및 소스코드 (0) | 2018.10.31 |
파이썬(Python) - 정규표현식(Regex) 특수문자 제거 설명 및 예제 소스 코드 (3) | 2018.07.20 |