在带有参数的列表中插入函数并使用它们

时间:2018-12-12 13:26:05

标签: python python-3.x function

我有一个像这样的参数: 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

谢谢。

3 个答案:

答案 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)))