Python by Structure: 데코레이터를 이용한 반환값 변환

발행: (2025년 12월 4일 오후 01:44 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

문제: 반복되는 출력 변환

def get_greeting(name):
    return f"hello, {name}".upper()

def get_status():
    return "system online".upper()

def get_error_message(code):
    return f"error code: {code}".upper()

반환값을 변환하는 데코레이터 사용

def uppercase_result(func):
    """Decorator to convert a function's string result to uppercase."""
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        if isinstance(result, str):
            return result.upper()
        return result
    return wrapper

@uppercase_result
def get_greeting(name):
    """Returns a personalized greeting."""
    return f"hello, {name}"

@uppercase_result
def get_status():
    """Returns the system status."""
    return "system online"

@uppercase_result
def get_error_message(code):
    """Returns an error message."""
    return f"error code: {code}"

# Usage
print(get_greeting("Alice"))
print(get_status())
print(get_error_message(404))

Output

HELLO, ALICE
SYSTEM ONLINE
ERROR CODE: 404

반환값 가로채기 이해하기

데코레이터는 다음과 같이 동작합니다:

  1. 원본 함수를 호출합니다.
  2. 그 결과를 캡처합니다.
  3. 결과가 문자열인지 확인합니다.
  4. 적절할 때만 .upper()를 적용합니다.
  5. (필요에 따라 변환된) 결과를 반환합니다.

타입‑안전 변환

타입 검사는 데코레이터된 함수가 문자열이 아닌 값을 반환할 때 오류를 방지합니다:

@uppercase_result
def get_error_code():
    """Returns a number, which should not be affected."""
    return 404

print(get_error_code())  # Outputs: 404

반환값 데코레이터를 언제 사용할까

다음과 같은 경우에 반환값 변환 데코레이터를 사용합니다:

  • 함수 출력에 일관된 포맷 적용 (대문자, 소문자, 타이틀 케이스)
  • 숫자 결과를 일관되게 반올림하거나 포맷팅
  • 보안을 위해 출력 정제 또는 이스케이프
  • 데이터 형식 변환 (dict → JSON, 객체 → 문자열)
  • 메타데이터를 추가하거나 결과를 표준 구조로 감싸기

예시: 숫자 결과 반올림

def round_result(decimals=2):
    """Decorator to round numeric results to specified decimals."""
    def decorator(func):
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            if isinstance(result, (int, float)):
                return round(result, decimals)
            return result
        return wrapper
    return decorator

@round_result(decimals=2)
def calculate_average(numbers):
    """Calculates the average of a list of numbers."""
    return sum(numbers) / len(numbers)

print(calculate_average([1.234, 2.567, 3.891]))  # Outputs: 2.56

함수를 깔끔하게 유지하기

관심사를 분리함으로써 함수는 핵심 로직에 집중하고, 데코레이터가 프레젠테이션이나 포맷팅을 담당합니다:

@uppercase_result
def get_greeting(name):
    return f"hello, {name}"

변환 로직을 바꾸려면 개별 함수를 수정할 필요 없이 데코레이터만 업데이트하면 됩니다. 이는 더 깔끔하고 유지보수가 쉬운 코드를 촉진합니다.

Back to Blog

관련 글

더 보기 »