装饰器将参数更改为函数

时间:2014-07-28 06:04:41

标签: python

如果参数的数量是任意长的话,如何使用装饰器返回给定函数并修改其所有参数?我的任务是将输入函数中的所有参数大写到装饰器,我无法弄清楚如何将无限量的新参数传递回函数。

我在理论上正在尝试这个:

def allCaps(func):  
    def ret(*args):  
        return func(*args.upper())
    return ret  

但你无法修改元组,因此它无法正常工作

2 个答案:

答案 0 :(得分:1)

类似的东西:

def allCaps(func):
    def wrapper(*args, **kwargs):
        if not all(isinstance(arg,str) for arg in args):
            # use isinstance(basestr, arg) for arg in args in python2
            raise TypeError("Wrong argument type")
        else:
            return func(*[arg.upper() for arg in args], **kwargs)
    return wrapper

@allCaps
def this_function_needs_allcaps(*args, **kwargs):
    print("These are my arguments!")
    for arg in args:
        print(arg)

答案 1 :(得分:0)

您希望使用参数构建一个新列表(它也可能是一个元组; Python *语法只需要一个可迭代的),如下所示:

new_args = [arg.upper() for arg in args]
return func(*new_args)