我有一个像这样的参数:
params={
'arg1':'a',
'arg2:'b',
'funcList':['x','y','z']}
如何正确地将它们插入函数,以便可以这样调用:
func(x(a,b),y(a,b),z(a,b))
也许我必须先将它们映射并解压缩,但是如何以pythonic的方式来做呢?
编辑II:
这里是更多情况的图片:
def X(a,b): # could be more args
print(a+b)
def Y(a,b): # could be more args
print(a*b)
# etc more funcs with identical args
定义调用函数可能是这样的:
def func(X,Y): # or maybe with *args?
print("args delivered")
然后调用func
可能是这样的:
func(X(1,2),Y(1,2)) # X's and Y's arguments are always identical
所有这些都源于单个数据,
params={
'a' :1,
'b' :2,
'funcList':['x','y']}
结果:
2
2
args delivered
谢谢。
答案 0 :(得分:2)
这应该有效:
def call(params):
p = params.copy()
return map(lambda i: i(*p.values()), p.pop("funcList"))
用法示例:
>>> x = lambda arg1, arg2, arg3: arg1 + arg2 + arg3
>>> params={'arg1':'a', 'arg2':'b', 'arg3': 'c', 'funcList':[x]}
>>> list(call(params))
['abc’]
然后您可以像这样调用函数:
>>> f = lambda i: print(i)
>>> f(*call(params))
abc
如果params[“funcList”]
中的值是字符串,而不是实际函数,则需要在eval
上添加call
:
def call(params):
p = params.copy()
return map(lambda i: eval(i)(*p.values()), p.pop("funcList"))
答案 1 :(得分:2)
params={
'arg1':'a',
'arg2':'b',
'funcList':['x','y','z']
}
result = func(*[
eval(f)(*[arg for key, arg in sorted(list(params.items())) if key != 'funcList'])
for f in params['funcList']
])
答案 2 :(得分:0)
我将@rassar的想法归功于我,我只想在这里说明这些细目,以及那些仍然无知的人(像我一样)的真实情况:
from itertools import chain # just for showing purpose
params={'arg1':'a','arg2':'b','arg3':'c','funcList':['A','B']}
def A(*args):
yield f'{args[-1]}' + f'{args[0]}'
def B(*args):
yield f'{args[0]}' + f'{args[-1]}'
list(chain(A('a','b','c'),B('a','b','c'))) # my intention with params
# result: ['ca', 'ac']
# could also be expressed with creating a new tuple:
toCall=(A('a','b','c'),B('a','b','c'))
# and use it like so:
list(chain(*toCall))
# result: ['ca', 'ac']
使用@rassar的:
def call(params):
p = params.copy()
return map(lambda i: eval(i)(*p.values()), p.pop("funcList"))
list(chain(*call(params)))