我打算这样做:
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]))
这可行但我可能有一些我不需要参数的功能。我不想让条件检查元组中的第二个条目是否存在。
还有其他方法吗?我愿意改变整个方法,包括输入格式。请建议。
答案 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'
答案 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 强>