You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中实现debug装饰器并结合validate_numeric完成参数校验与调试

解决Python装饰器调试与参数校验兼容问题

问题背景

已有一个validate_numeric装饰器可校验函数输入是否为int/float类型,非法参数返回"The input arguments must be numeric";需新增debug装饰器,输出函数执行时的位置参数、关键字参数及结果,且解决sum(1, "a")触发TypeError无法输出预期信息的问题。

完整实现代码

def validate_numeric(func):
    def wrapper(*args, **kwargs):
        # 校验位置参数
        for arg in args:
            if not isinstance(arg, (int, float)):
                return "The input arguments must be numeric"
        # 校验关键字参数
        for val in kwargs.values():
            if not isinstance(val, (int, float)):
                return "The input arguments must be numeric"
        return func(*args, **kwargs)
    return wrapper

def debug(func):
    def wrapper(*args, **kwargs):
        # 格式化位置参数为字符串
        pos_args_str = ", ".join(str(arg) for arg in args)
        # 格式化关键字参数为字符串
        kw_args_str = ", ".join(f"{k}={v}" for k, v in kwargs.items())
        
        # 执行被装饰函数,捕获所有结果(包括校验错误返回值)
        result = func(*args, **kwargs)
        
        # 按指定格式输出调试信息
        print("**********")
        print(f"位置参数: {pos_args_str}" if pos_args_str else "没有位置参数")
        print(f"关键字参数: {kw_args_str}" if kw_args_str else "没有关键字参数")
        print(f"结果: {result}")
    return wrapper

# 测试用例(注意装饰器顺序:debug在外层,先捕获参数再执行校验)
@debug
@validate_numeric
def calculate(*args, **kwargs):
    return sum(args) + sum(kwargs.values())

# 执行测试
calculate(1, 2)
calculate(a=1, b=2)
calculate(1, "a")

输出结果

**********
位置参数: 1, 2
没有关键字参数
结果: 3
**********
没有位置参数
关键字参数: a=1, b=2
结果: 3
**********
位置参数: 1, a
没有关键字参数
结果: The input arguments must be numeric

关键修正点

  1. 装饰器顺序调整:将@debug放在@validate_numeric外层,确保先捕获参数信息,再执行参数校验逻辑,避免校验失败时无法记录参数。
  2. 参数无差别字符串化:直接将所有参数转为字符串,无论类型是否合法,保证非法参数也能被正确输出。
  3. 统一结果捕获:直接捕获被装饰函数的所有返回值(包括校验错误的返回字符串),确保所有场景下都能生成符合要求的调试信息。

内容的提问来源于stack exchange,提问作者Julio Arana Jr.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:33:30