Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数列表(带参数)作为python中的输入_Python_Function - Fatal编程技术网

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

将函数列表(带参数)作为python中的输入,python,function,Python,Function,我打算这样做: config = {"methods": ["function1(params1)", "function2(params2)"] } 这是我从json文件读取的。所以要使用它,我需要将它传递给另一个函数,如下所示: for method in config[methods]: foo(global()[method]) 我知道这不起作用,因为globals只将函数名从字符串转换为函数,但我也需要它来处理带参数的函数 我也想到了这一点: config = {"meth

我打算这样做:

config = {"methods": ["function1(params1)", "function2(params2)"] }
这是我从json文件读取的。所以要使用它,我需要将它传递给另一个函数,如下所示:

for method in config[methods]:
    foo(global()[method])
我知道这不起作用,因为globals只将函数名从字符串转换为函数,但我也需要它来处理带参数的函数

我也想到了这一点:

config = {"methods": [("function1", params1) , ("function2", params2)] }
for method in config[methods]:
    foo(global()[method[0]](method[1]))
这将起作用,但我可能有一些不需要参数的函数。我不想对元组中的第二个条目是否存在进行条件检查


还有别的办法吗?我愿意改变整个方法,包括输入格式。请提出建议。

以下是一个简化示例,可用于任意数量的参数:

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'

这里对@sshashank124 answer做了一点修改,它更简单,因为它接受数据的方式不同。我认为使用
'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)

JSON数据来自哪里?你能改变它的格式吗?用户是否可以更改JSON数据?因为如果他们可以,你会有一个安全问题,一个巨大的问题。如果你真的想阅读Python函数签名列表,然后将它们用作函数。。。为什么不直接导入Python模块?@ire_和_curses:它是配置文件的一部分,字典中还有其他参数。我在问题中只提到了这一部分。@MartijnPieters:这是一个测试套件。它用于用户输入。安全不是一个问题issue@Kevin:然后分离函数名和参数。使用已知函数的映射来查找函数,而不是
globals()
@Kevin,很高兴您喜欢它。我为这个绞尽脑汁了半个小时你完全理解我的问题。谢谢……)