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
반환값 가로채기 이해하기
데코레이터는 다음과 같이 동작합니다:
- 원본 함수를 호출합니다.
- 그 결과를 캡처합니다.
- 결과가 문자열인지 확인합니다.
- 적절할 때만
.upper()를 적용합니다. - (필요에 따라 변환된) 결과를 반환합니다.
타입‑안전 변환
타입 검사는 데코레이터된 함수가 문자열이 아닌 값을 반환할 때 오류를 방지합니다:
@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}"
변환 로직을 바꾸려면 개별 함수를 수정할 필요 없이 데코레이터만 업데이트하면 됩니다. 이는 더 깔끔하고 유지보수가 쉬운 코드를 촉진합니다.