Python 结构篇:使用装饰器进行返回值转换
发布: (2025年12月4日 GMT+8 12:44)
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))
输出
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}"
只需更新装饰器即可改变转换方式,而不必修改每个单独的函数。这有助于保持代码更清晰、更易维护。