【问题标题】:Convert function arguments with a decorator使用装饰器转换函数参数
【发布时间】:2021-10-01 08:51:41
【问题描述】:

我想用这样的装饰器转换一些函数参数:

def check_args(*args1):
def decorator(func):
    def wrapper(*args, **kwargs):
        for i in range(len(args)):
            if type(args[i]) == args1[i]:
                args[i] = args1[i](args[i])
        result = func(*args, **kwargs)
        return result
    return wrapper
return decorator

@check_args(str, str)
def function(arg1, arg2):
    pass

但是当我运行它时,我得到了这个错误:

    args[i] = args1[i](args[i ]) 
TypeError: 'tuple' object does not support item assignment
args[i] is not a tuple, it's an int and that code should translate to 5 = str(5)

你能帮我解决这个问题还是用其他方法来转换参数,但仍然使用装饰器?

【问题讨论】:

  • args 是一个元组,就像错误所说的那样,您不能重新分配元组的元素。您需要先将元组转换为列表才能重新分配其中的元素。
  • args一定是tuple,所以不能赋值给tuple的元素。无论如何,你的意思是:if type(args[i]) != args1[i]:?否则每次转换都是没有意义的。
  • @StevieG25 该错误表明它不是该行;它的下一行。类型检查行不会导致该错误。

标签: python python-3.x decorator


【解决方案1】:

因此,您的意思是转换每个类型错误的参数,但您必须先将参数从 tuple 转换为 list

def check_args(*args1):
    def decorator(func):
        def wrapper(*args, **kwargs):
            args = list(args)         # convert args to a list here
            for i in range(len(args)):
                if type(args[i]) != args1[i]:
                    args[i] = args1[i](args[i])
            result = func(*args, **kwargs)  # *args works for both tuples and lists
            return result
        return wrapper
    return decorator

@check_args(str, str)
def function(arg1, arg2):
    pass

【讨论】:

  • 谢谢,解决了。我以为错误说 args[i] 是一个元组而不是 args。
  • 不,错误是说该行发生了错误,但是因为argstuple,所以不支持项分配,即不允许args[i] = ...
猜你喜欢
  • 1970-01-01
  • 2016-01-30
  • 2014-07-21
  • 2011-06-25
  • 2019-12-20
  • 2019-04-25
  • 2021-11-21
  • 1970-01-01
  • 2018-05-24
相关资源
最近更新 更多