반응형
안녕하세요. TDR입니다.
오늘은 Decorator에 대해서 간략히 정리해 보겠습니다.
이전 포스팅에서 @classmethod, @staticmethod와 같은 표현을 보셨을 겁니다. 이게 decorator였습니다.
우선 decorator가 어떤건지 간략히 설명 드리면 다음과 같습니다.
장식자라고도 불리며, 기존 코드를 수정하지 않으면서 추가 기능을 추가할 수 있습니다.
간단한 예를 보면 다음과 같습니다.
def start_end(func):
def wrapper(): # 관행적으로 이 이름을 씀
print('>> ' + func.__name__ + ' Start')
func() # some_function() 호출
print('>> ' + func.__name__ + ' End')
return wrapper
@start_end
def some_function():
print('This is some function')
some_function()
## Result
# >> some_function Start
# This is some function
# >> some_function End
@start_end를 붙임으로서, start_end 함수의 내부 함수인 wrapper 함수가 호출된 것과 동일한 효과를 볼 수 있습니다. 이와 같은 기능을 이용하면 기존 함수의 시작과 끝을 표기 할 수 있습니다.
만약 decorator를 쓰지 않고 동일하게 구현을 한다면 다음과 같이 할 수 있습니다.
def start_end(func):
def wrapper():
print('>> ' + func.__name__ + ' Start')
func()
print('>> ' + func.__name__ + ' End')
return wrapper
# Decorator를 쓰지 않음
def some_function():
print('This is some function')
# 함수를 인자로 전달해서 내부를 return 받음. (closure)
wrapper = start_end(some_function)
wrapper()
## Result
# >> some_function Start
# This is some function
# >> some_function End
그럼 이번에는 변수가 있는 decorator를 봐보겠습니다.
def print_result(func):
def wrapper(*args):
print(args) # (10, 20, 30)
print(*args) # 10 20 30
r = func(*args) # func에 args를 언패킹하여 넣어줌
print(func.__name__ + ' : ', r)
return wrapper
@print_result
def get_sum(*args):
return sum(args)
get_sum(10,20,30)
## Result
# get_sum : 60
이전 예제인 function에서 봐온 가변 인수를 이용하여 매개변수를 전달하고 있습니다. (자세한건 아래 링크)
python에서는 기본적으로 tuple로 패킹이 되는데, 같은 방법으로 dictionary unpacking을 통한 인수 전달도 가능합니다.
def print_result(func):
def wrapper(**kwargs):
print(type(kwargs), kwargs) # <class 'dict'> {'x': 10, 'y': 20, 'z': 30}
print(*kwargs) # x y z
r = func(**kwargs) # func에 kwargs를 언패킹하여 넣어줌
print(func.__name__ + ' : ', r)
return wrapper
@print_result
def get_sum(**kwargs):
return sum(kwargs.values())
get_sum(x=10, y=20, z=30)
## Result
# get_sum : 60
다음에는 class를 이용한 decorator를 만드는 방법과 decorator에 변수를 전달하는 방법을 알아보겠습니다.
반응형
'Computer & Program > python' 카테고리의 다른 글
[python] Iterator(반복자) - 01 (0) | 2024.03.02 |
---|---|
[python] Decorator(데코레이터) - 02 (0) | 2024.03.01 |
[python] Assert(어설트) (2) | 2024.02.28 |
[python] try-except (예외처리) (0) | 2024.02.27 |
[python] class(클래스) - 03 (0) | 2024.02.26 |
댓글