在python中将函数列表(带参数)作为输入

时间:2014-05-22 07:10:10

标签: python function

我打算这样做:

config = {"methods": ["function1(params1)", "function2(params2)"] }

这是我从json文件中读取的。所以要使用它,我需要将它传递给另一个函数,如下所示:

for method in config[methods]:
    foo(global()[method])

我知道这不会起作用,因为全局变量只将函数名称从字符串转换为函数,但我需要这个来处理带参数的函数。

我也想到了这个:

config = {"methods": [("function1", params1) , ("function2", params2)] }
for method in config[methods]:
    foo(global()[method[0]](method[1]))

这可行但我可能有一些我不需要参数的功能。我不想让条件检查元组中的第二个条目是否存在。

还有其他方法吗?我愿意改变整个方法,包括输入格式。请建议。

2 个答案:

答案 0 :(得分:2)

以下是适用于任意数量参数的简化示例:

from re import findall

def a(*args):
    for i in args:
        print i

config = {"methods": ["a('hello')", "a('hello','bye')", "a()"]}

for i in config['methods']:
    x,y = findall(r'(.*?)\((.*?)\)', i)[0]
    y = [i.strip() for i in y.split(',')]
    globals()[x](*y)


[OUTPUT]
'hello'
'hello'
'bye'

DEMO

答案 1 :(得分:0)

这里是@ sshashank124答案的略微修改,这更简单,因为它接受不同的数据。我认为使用'f(arg1, arg2)'并不是那么直观,而是非常重复。相反,我将它指向一个列表,指向一个列表,每个列表代表一个执行,只包含参数,因此:

config = { "methods": {"a": [ ["hello"], ["hello","bye"], [] ]} }

表示:

a("hello")
a("hello", "bye")
a()

我不确定它是否比Shank的版本更好,但我认为它更容易理解:

def a(*args):
    for i in args:
        print i

config = { "methods": {"a": [ ["hello"], ['hello','bye'], [] ]} }

for f,args in config['methods'].items():
    for arg in args:
        globals()[f](*arg)

<强> DEMO