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
关键修正点
- 装饰器顺序调整:将
@debug放在@validate_numeric外层,确保先捕获参数信息,再执行参数校验逻辑,避免校验失败时无法记录参数。 - 参数无差别字符串化:直接将所有参数转为字符串,无论类型是否合法,保证非法参数也能被正确输出。
- 统一结果捕获:直接捕获被装饰函数的所有返回值(包括校验错误的返回字符串),确保所有场景下都能生成符合要求的调试信息。
内容的提问来源于stack exchange,提问作者Julio Arana Jr.
相关产品推荐
相关产品推荐

