如何使用装饰仅对列表中的数字求和?

How to sum only digits from a list using decorate?

我试图将列表传递给函数 somme(计算列表中数字的总和)
但我错了 unsupported operand type(s) for +=: 'int' and 'str'
我决定创建 nettoyage 函数来过滤列表和 return 只有数字!
这就是我到目前为止所尝试的?

def nettoyage(func):
    def inner(*args):
        digits = []
        for i in args:
            if(str(i).isdigit()):
                digits.append(i)
        t=tuple(digits)
        return func(*t)
    return inner

@nettoyage
def somme(l):
    s=0
    for i in l:
        s+=i
    return s #or just sum(l)

print(somme([1,2,3,4,5,'a','b'])) # -> [1,2,3,4,5] 

TypeError: somme() missing 1 required positional argument: 'l'

PS:我知道我可以使用过滤函数或者只是循环遍历一个列表并只累加一个函数的数字但是
我想知道更多关于装饰的信息。

argsfunc 函数的所有参数表示为一个列表,因此要获得第一个,值列表做 args[0]。然后无需构建 tuple 并在单个参数处传递列表 digits,调用 func(*t) 调用,如 func(1, 2, 3, 4, 5),这不是 somme 定义

def nettoyage(func):
    def inner(*args):
        digits = []
        for i in args[0]:
            if str(i).isdigit():
                digits.append(i)
        return func(digits)
    return inner

可以转换成list-comprehension

def nettoyage(func):
    def inner(*args):
        return func([i for i in args[0] if str(i).isdigit()])
    return inner

15 而不是 [1,2,3,4,5]

print(somme([1, 2, 3, 4, 5, 'a', 'b']))  # -> 15

自己注意:

您可以通过一些打印(argsl)解决 所有。当某个变量不能正常工作时:打印它