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

理解返回值拦截

装饰器的工作原理如下:

  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

相关文章

阅读更多 »