파이썬 데코레이터 : 개념, 사용 이유, 활용 법

이번 포스트에서는 파이썬 데코레이터 개념, 사용 이유, 사용 법에 정리하였습니다.

decorator를 이해하기 위한 사전 개념은 다음과 같습니다.

1. 함수의 특징
2. 클로저

데코레이터 개념

Python에서 데코레이터는 다른 함수의 동작을 수정하거나 확장하는 데 사용할 수 있는 특별한 유형의 함수입니다. 코드를 직접 변경하지 않고도 추가 기능으로 함수를 래핑하거나 장식할 수 있습니다.

데코레이터 선언

데코레이터는 본질적으로 다른 함수를 인자로 취하는 함수입니다. 일반적으로 주어진 함수에 일부 기능을 추가한 다음 수정된 함수를 반환합니다.

def my_decorator(func):
    def wrapper():
        print("func 호출 전")
        func()
        print("func 호출 후")
    return wrapper

데코레이터 적용

함수 정의 바로 위에 있는 @decorator_name 구문을 사용하여 함수에 데코레이터를 적용할 수 있습니다.

@my_decorator
def say_hello():
    print("Hello!")

데코레이터 사용

데코레이팅된 함수(이 경우 say_hello)를 호출하면 실제로는 my_decorator 함수가 먼저 실행되면서 say_hello 함수를 인자로 받고 이를 실행하게 됩니다.

say_hello()
func 호출 전
Hello!
func 호출 후

위에서는 코드에서는 say_hello()만 실행했지만 decorator 선언으로 인해 실제 아래와 동일하게 작동한다고 보시면 됩니다.

my_decorator(say_hello)

데코레이터 사용 이유

데코레이터를 사용하면 여러 기능에 적용해야 하는 공통 기능을 캡슐화하고 재사용할 수 있습니다

데코레이터를 사용하면 함수의 핵심 로직을 깔끔하고 집중적으로 유지할 수 있으며 데코레이터가 제공하는 추가 기능은 추상화됩니다

로깅, 유효성 체크와 같은 공통 기능 구현에 유용합니다.

데코레이터의 활용 법

데코레이터를 이용하여 로깅 기능을 구현 해 보았습니다. 만일 데코레이터를 쓰지 않으면 로깅을 원하는 모든 함수마다 print 문을 적어야 합니다. 이는 코드를 지저분 하게 하여 핵심 로직이 무엇인지 파악하기 힘들게 합니다. 반면 데코레이터를 사용하면 코드의 재사용성이 크게 증가되며 핵심 로직을 깔끔하게 유지할 수 있는 것을 확인 할 수 있습니다.

def logging_decorator(func):
    def wrapper(*args, **kwargs):
        if args and kwargs:
            print(f"Calling function [{func.__name__}] with arguments {args}, {kwargs}")
        elif args:
            print(f"Calling function [{func.__name__}] with arguments {args}")
        elif kwargs:
            print(f"Calling function [{func.__name__}] with arguments {kwargs}")
        else:
            print(f"Calling function [{func.__name__}]")
        result = func(*args, **kwargs)
        print(f"[{func.__name__}] function returned {result}\n")
        return result
    return wrapper

@logging_decorator
def add(a, b):
    return a + b

@logging_decorator
def get_longer_str(*args):
    longer_str =sorted(args, key=lambda x:len(x))[-1]
    return longer_str


result_add = add(3, 5)
result_subtract = get_longer_str('무엇이 더 길까', '무엇이 무엇이 더 길까요?..', '이 글이 더 길까..?')
Calling function [add] with arguments (3, 5)
[add] function returned 8

Calling function [get_longer_str] with arguments ('무엇이 더 길까', '무엇이 무엇이 더 길까요?..', '이 글이 더 길까..?')
[get_longer_str] function returned 무엇이 무엇이 더 길까요?..

PEP 318 – Decorators for Functions and Methods | peps.python.org

Leave a Comment

목차