将函数及其参数传递给另一个函数
passing functions and its arguments to another function
我有子函数的树类型:
- 一个没有任何参数(arguments),
- 秒,一个参数
- 第三个有多个参数(元组)
我正在尝试将该函数及其参数传递给另一个函数,该函数对所有子函数的结果求和,return 求和值。
该函数中的参数应该是:每个子函数的名称作为位置参数 (*args),每个子函数的参数作为键值参数 (*kvargs)。
示例:
def no_arg()
def one_arg(a)
def multiple_args(a, b, c, e, f)
# execution of function_results_sum:
function_results_sum(
no_arg, one_arg, multiple_args,
one_arg=23,
multiple_args=(1, 2, 3, 4, 5))
到目前为止我做了什么:
def no_arg():
return 5
def ident(x):
return x
def mult(x, y):
return x * y
def function_results_sum(*args, **kwargs):
return no_arg() + ident(kwargs[ident.__name__]) + mult(*kwargs[mult.__name__])
上面的代码将参数传递给每个子函数,但是子函数名称是硬编码的。我想修改当前代码以便能够从 *args 中获取函数名称。下面我写了一个伪代码来表达我想要实现的目标:
def function_results_sum(*args, **kwargs):
for functionName in args:
result = sum(funcionName(kwargs))
return result
我已经花了一整天的时间来解决这个问题,所以请不要给我写信 "using google doesn't hurt" ;)
像这样的东西会起作用:
def no_arg():
return 5
def one_arg(x):
return x
def multiple_args(x, y):
return x * y
def function_results_sum(*args, **kwargs):
result = 0
for func in args:
result += func(*kwargs[func.__name__])
return result
输出:
function_results_sum(
no_arg, one_arg, multiple_args,
no_arg=(),
one_arg=(23, ),
multiple_args=(1,5))
33
您所要求的唯一区别是您必须将 args 放入元组中,然后解压为 args 以便稍后传递。
如果您不想为无参数函数提供任何东西,您可以仔细检查函数名称是否在 kwargs 中:
def function_results_sum(*args, **kwargs):
result = 0
for func in args:
if func.__name__ i kwargs:
result += func(*kwargs[func.__name__])
else:
result += func()
return result
通过 goolging 'python determine number of args for passed function' 我发现 How can I find the number of arguments of a Python function?
我很确定你不想要 **kwars 键值语法所以我使用 func_list
常规 arg 和 *args
from inspect import signature
def function_results_sum(func_list, *args):
arg_gen = (e for e in args)
return sum([func(*(next(arg_gen)
for _ in range(len(signature(func).parameters))))
for func in func_list])
function_results_sum([no_arg, ident, mult], 7,8,9)
84
通过为 Functions
和(假定的)参数(任何非类型 Function
)
解析 *args 可以使输入更平坦
from inspect import signature
import types
def function_results_sum(*args):
func_gen = (e for e in args if isinstance(e, types.FunctionType))
arg_gen = (e for e in args if not isinstance(e, types.FunctionType))
return sum(func(*(next(arg_gen)
for _ in range(len(signature(func).parameters))))
for func in func_gen)
function_results_sum(no_arg, ident, mult, 10,6,90)
555
函数的顺序和参数的顺序很重要,但可以分开,交错:
function_results_sum(no_arg, 10, ident, 6, 90, mult)
Out[399]: 555
Post of R Nar 正是我试图达到的目标。我添加了额外的 if 语句来验证 kwarg 是整数还是元组。感谢您不必将所有 **kwargs 放在一个元组中。谢谢大家的帮助!
def function_results_sum(*args, **kwargs):
result = 0
for func in args:
if func.__name__ in kwargs:
if type(kwargs[func.__name__]) == int:
result += func(kwargs[func.__name__])
elif type(kwargs[func.__name__]) == tuple:
result += func(*kwargs[func.__name__])
else:
result += func()
return result
result = function_results_sum(no_arg, ident, mult, ident=2, mult=(3, 4))
print(result)
我有子函数的树类型:
- 一个没有任何参数(arguments),
- 秒,一个参数
- 第三个有多个参数(元组)
我正在尝试将该函数及其参数传递给另一个函数,该函数对所有子函数的结果求和,return 求和值。 该函数中的参数应该是:每个子函数的名称作为位置参数 (*args),每个子函数的参数作为键值参数 (*kvargs)。
示例:
def no_arg()
def one_arg(a)
def multiple_args(a, b, c, e, f)
# execution of function_results_sum:
function_results_sum(
no_arg, one_arg, multiple_args,
one_arg=23,
multiple_args=(1, 2, 3, 4, 5))
到目前为止我做了什么:
def no_arg():
return 5
def ident(x):
return x
def mult(x, y):
return x * y
def function_results_sum(*args, **kwargs):
return no_arg() + ident(kwargs[ident.__name__]) + mult(*kwargs[mult.__name__])
上面的代码将参数传递给每个子函数,但是子函数名称是硬编码的。我想修改当前代码以便能够从 *args 中获取函数名称。下面我写了一个伪代码来表达我想要实现的目标:
def function_results_sum(*args, **kwargs):
for functionName in args:
result = sum(funcionName(kwargs))
return result
我已经花了一整天的时间来解决这个问题,所以请不要给我写信 "using google doesn't hurt" ;)
像这样的东西会起作用:
def no_arg():
return 5
def one_arg(x):
return x
def multiple_args(x, y):
return x * y
def function_results_sum(*args, **kwargs):
result = 0
for func in args:
result += func(*kwargs[func.__name__])
return result
输出:
function_results_sum(
no_arg, one_arg, multiple_args,
no_arg=(),
one_arg=(23, ),
multiple_args=(1,5))
33
您所要求的唯一区别是您必须将 args 放入元组中,然后解压为 args 以便稍后传递。
如果您不想为无参数函数提供任何东西,您可以仔细检查函数名称是否在 kwargs 中:
def function_results_sum(*args, **kwargs):
result = 0
for func in args:
if func.__name__ i kwargs:
result += func(*kwargs[func.__name__])
else:
result += func()
return result
通过 goolging 'python determine number of args for passed function' 我发现 How can I find the number of arguments of a Python function?
我很确定你不想要 **kwars 键值语法所以我使用 func_list
常规 arg 和 *args
from inspect import signature
def function_results_sum(func_list, *args):
arg_gen = (e for e in args)
return sum([func(*(next(arg_gen)
for _ in range(len(signature(func).parameters))))
for func in func_list])
function_results_sum([no_arg, ident, mult], 7,8,9)
84
通过为 Functions
和(假定的)参数(任何非类型 Function
)
from inspect import signature
import types
def function_results_sum(*args):
func_gen = (e for e in args if isinstance(e, types.FunctionType))
arg_gen = (e for e in args if not isinstance(e, types.FunctionType))
return sum(func(*(next(arg_gen)
for _ in range(len(signature(func).parameters))))
for func in func_gen)
function_results_sum(no_arg, ident, mult, 10,6,90)
555
函数的顺序和参数的顺序很重要,但可以分开,交错:
function_results_sum(no_arg, 10, ident, 6, 90, mult)
Out[399]: 555
Post of R Nar 正是我试图达到的目标。我添加了额外的 if 语句来验证 kwarg 是整数还是元组。感谢您不必将所有 **kwargs 放在一个元组中。谢谢大家的帮助!
def function_results_sum(*args, **kwargs):
result = 0
for func in args:
if func.__name__ in kwargs:
if type(kwargs[func.__name__]) == int:
result += func(kwargs[func.__name__])
elif type(kwargs[func.__name__]) == tuple:
result += func(*kwargs[func.__name__])
else:
result += func()
return result
result = function_results_sum(no_arg, ident, mult, ident=2, mult=(3, 4))
print(result)