Python 데코레이터: 함수 래핑 및 수정

함수 동작을 동적으로 수정하는 Python 데코레이터를 알아보세요. 래퍼 함수, @ 구문, 데코레이터의 인수 처리를 이해합니다.

에디터에서 사용해 보세요

개요

데코레이터는 Python의 가장 우아하고 강력한 디자인 패턴 중 하나입니다. 이를 통해 개발자는 소스 코드를 영구적으로 변경하지 않고도 함수, 메서드 또는 클래스의 동작을 수정하거나 확장할 수 있습니다. 데코레이터는 전처리 및 후처리 단계를 실행하기 위해 다른 함수 안에 함수를 래핑하는 것으로 생각하면 됩니다. 이를 통해 데코레이터는 로깅, 타이밍, 유효성 검사 또는 액세스 제어와 같은 교차 문제를 구현하는 데 완벽합니다.

기본적으로 데코레이터는 Python 함수가 일급 시민이기 때문에 작동합니다. 즉, 함수를 다른 함수에 인수로 전달하고, 함수에서 반환하고, 변수에 할당할 수 있습니다. 데코레이터는 단순히 다른 함수를 인수로 취하고, 일부 추가 로직과 함께 원래 함수를 실행하는 중첩 래퍼 함수를 ​​정의하고, 이 래퍼 함수를 ​​반환하여 원본을 대체하는 함수입니다.

데코레이터를 간단하고 깔끔하게 적용하기 위해 Python은 대상 함수 정의 바로 위에 배치되는 `@ decorator_name` 구문 설탕을 제공합니다. 장식된 함수를 호출할 때 Python은 대신 래퍼를 호출합니다. 함수가 매개변수를 허용하는 경우 래퍼는 임의의 인수(`*args` 및 `**kwargs`)를 허용하고 올바르게 전달해야 합니다. 데코레이터를 이해하면 고도로 모듈화되고 깔끔한 DRY(Don't Repeat Yourself) 코드를 작성할 수 있습니다.

코드 및 실행 출력

함수 실행 세부 정보를 추적하고 기록하는 사용자 지정 데코레이터입니다.

def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
터미널 출력
Calling multiply with args: (5, 4)
multiply returned: 20

단계별 구현

  • 성능 모니터에 런타임 메트릭 로깅
  • 경로에 대한 인증 및 승인 확인 시행
  • 값비싼 계산 결과를 캐싱하거나 메모하기

자주 묻는 질문

데코레이터는 인수를 어떻게 처리합니까?

중첩된 래퍼 함수에 *args 및 **kwargs를 사용하면 위치 또는 키워드 매개변수를 수신하여 래핑된 함수에 전달할 수 있습니다.

하나의 함수에 여러 데코레이터를 적용할 수 있나요?

예, 쌓을 수 있습니다. 위에서 아래로(가장 안쪽에서 가장 바깥쪽으로) 순서대로 실행됩니다.

관련 주제

권장 Python 리소스

관련 대화형 튜토리얼, 치트 시트, 코드 비교를 통해 지식을 확장하세요.