如何用Python装饰器修改任意数量函数参数的类型?
使用装饰器优雅处理任意数量参数的类型检查与转换
问题分析
你当前的代码存在核心问题:inner函数的循环中,修改的arg只是原参数的临时副本,并没有改变args元组中的实际元素(元组本身不可变,且循环变量是独立引用),因此转换后的参数并未传递给原函数,return func(*args)传入的仍是原始未转换参数。
优雅解决方案
基础修复版本
核心思路是重新构建转换后的参数列表,再将其解包传入原函数:
def convert_argument_types(func): def inner(*args): converted_args = [] for arg in args: # 替换为你的目标类型和转换逻辑 if not isinstance(arg, int): arg = int(arg) converted_args.append(arg) # 将转换后的参数解包传入原函数 return func(*converted_args) return inner @convert_argument_types def someFunction(arg1, arg2): print(f"参数类型:arg1={type(arg1)}, arg2={type(arg2)}") return arg1 + arg2 # 测试 someFunction("10", 25.6) # 输出35,参数均被转为int类型
通用可配置版本
如果需要装饰器支持不同的目标类型和转换逻辑,可以让装饰器接收参数,实现更高复用性:
def convert_args(target_type, convert_func): def decorator(func): def inner(*args, **kwargs): # 处理位置参数 converted_args = [ arg if isinstance(arg, target_type) else convert_func(arg) for arg in args ] # 可选:处理关键字参数 converted_kwargs = { key: val if isinstance(val, target_type) else convert_func(val) for key, val in kwargs.items() } return func(*converted_args, **converted_kwargs) return inner return decorator # 使用示例1:转换为int类型 @convert_args(int, int) def add(a, b): return a + b print(add("7", 3.9)) # 输出10 print(add(a="15", b=20.3)) # 输出35 # 使用示例2:转换为str类型 @convert_args(str, str) def combine(x, y): return x + y print(combine(456, 789)) # 输出"456789"
关键说明
- 原代码的问题在于循环中修改的是临时变量,而非实际参数集合。通过构建新的参数列表,可确保转换后的参数被正确传递。
- 通用版本的装饰器支持位置参数和关键字参数的处理,同时允许自定义目标类型与转换函数,适配更多场景。
内容的提问来源于stack exchange,提问作者László Marton
相关产品推荐
相关产品推荐

