如何使函数“调用”接受任何函数作为参数,并在python中为她提供参数?

问题描述

如何使函数调用”接受任何函数作为参数,并在python中为她提供参数?

例如,

def add(a,b):
  return a + b
call(add,2,3) == 5
call(add,a = 4,b = 1) == 5
call(max,[3,4,7]) == 7

我尝试过:


def call(fun,*args,**kwargs):
    if args and kwargs:
        return fun(args,kwargs)
    elif kwargs:
        return fun(kwargs)
    elif args:
        return fun(args)
    else:
        return None

这就是我得到的:

Failed. Runtime error

Error:
Traceback (most recent call last):
  File "jailed_code",line 22,in <module>
    got = call(my_sum,1,7)
  File "jailed_code",line 9,in call
    return fun(args)
  File "jailed_code",line 19,in my_sum
    return sum(args)
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

我哪里出错了?

解决方法

您需要在args内打开kwargscall的包装:

def add(a,b):
    return a+b

def call(fun,*args,**kwargs):
    if args and kwargs:
        return fun(*args,**kwargs)
    elif kwargs:
        return fun(**kwargs)
    elif args:
        return fun(*args)
    else:
        return None

print(call(add,2,3)) # 5
print(call(add,a = 4,b = 1)) # 5
print(call(max,[3,4,7])) # 7