본문 바로가기
프로그래밍언어/파이썬[중급]

[파이썬][중급] Chapter31. 데코레이터 중첩과 인자 전달

by about_IT 2025. 5. 24.
728x90

데코레이터는 함수의 기능을 확장할 수 있는 강력한 도구이며, 중첩 적용도 가능합니다. 또한 데코레이터 자체에 인자를 전달하면 다양한 동작을 동적으로 제어할 수 있습니다. 이 장에서는 중첩 데코레이터와 인자 있는 데코레이터 구현 방법을 소개합니다.

 

● 데코레이터 중첩 사용

하나의 함수에 여러 데코레이터를 적용하면 아래쪽 데코레이터부터 순차적으로 실행됩니다.

def deco1(func):
    def wrapper(*args, **kwargs):
        print("deco1 시작")
        result = func(*args, **kwargs)
        print("deco1 끝")
        return result
    return wrapper

def deco2(func):
    def wrapper(*args, **kwargs):
        print("deco2 시작")
        result = func(*args, **kwargs)
        print("deco2 끝")
        return result
    return wrapper

@deco1
@deco2
def hello():
    print("Hello")

hello()

출력 순서는 deco1 → deco2 → hello → deco2 끝 → deco1 끝 순입니다.

 

● 인자 있는 데코레이터 만들기

데코레이터에 인자를 전달하려면 함수 3중 구조로 작성해야 합니다.

def tag_decorator(tag):
    def outer(func):
        def wrapper(*args, **kwargs):
            print(f"<{tag}>")
            result = func(*args, **kwargs)
            print(f"</{tag}>")
            return result
        return wrapper
    return outer

@tag_decorator("b")
def greet():
    print("Hello")

greet()

tag 값을 바꾸면 동적으로 동작을 제어할 수 있는 유연한 데코레이터가 완성됩니다.

 

● functools.wraps 사용

중첩이나 인자 있는 데코레이터를 사용할 때는 functools.wraps를 활용하여 원래 함수 이름과 docstring을 유지해야 합니다.

from functools import wraps

def deco(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

 

● 마무리

데코레이터는 반복되는 코드 구조를 줄이고, 함수의 동작을 유연하게 확장하는 데 매우 적합합니다. 중첩 구조와 인자 전달을 통해 조건에 따라 기능을 제어하는 고급 데코레이터 패턴을 활용해보시기 바랍니다.

728x90