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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:01:02