본문 바로가기
Computer & Program/python

[python] Decorator(데코레이터) - 01

by TDRemon 2024. 2. 29.
반응형

안녕하세요. 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] function(함수) - 02

안녕하세요. TDR 입니다. 지난번 함수 1부에 이어 가변인수, 키워드 인수 등에 대해서 정리해 보겠습니다. [python] function (함수) - 01 안녕하세요. TDR입니다. 오늘은 python function(함수)의 여러가지 사

tdremon.tistory.com

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에 변수를 전달하는 방법을 알아보겠습니다.

 

[python] Decorator(데코레이터) - 02

안녕하세요. TDR입니다. 오늘은 저번에 이어 class를 이용한 decorator 구현법과 decorator에 변수를 할당하는 방법을 알아보겠습니다. (Decorator - 01은 아래 링크 참조) [python] Decorator(데코레이터) - 01 안

tdremon.tistory.com

 

반응형

'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

댓글