Python3:调用函数保存为字典中的值(字符串)

时间:2015-04-11 04:42:05

标签: python regex dictionary

背景:

我正在阅读一个python文件(.py),它定义了许多函数,并使用正则表达式获取所有函数的名称并将它们存储在列表中。

d_fncs = {}
list_fncs = []

with open('/home/path/somefile.py', 'r') as f:
    for row in f:
        search = re.search(r'def (.*)\(', row)
        if search:                             
            list_fncs.append(search.group(1))

以上工作正常并且按预期返回函数名称列表作为字符串。我有另一个列表,我计划用作计数器。

counter = [str(i) for i in range(1,len(list_fncs)+1)]

最后,我将两个列表压缩,以获得一个字典,其中包含'键。是数字和相关的'值'是函数名称

d_fncs = dict(zip(counter,list_fncs))

问题:

这里的目的是要求用户输入一个与该词典(计数器)的键匹配的输入。一旦匹配密钥,就执行与之关联的功能。这样的事情会在后面的代码中发生:

def option_to_run(check, option_enter_by_user):
    if check == 'True':
        return (connection(d_fncs[option]))

def connection(fnc):
    conn_name = Connect(some args..) #class imported 
    fnc(conn_name)

在这种情况下,由于dict的值是字符串,我收到以下错误:

File "/home/path/filename.py", line 114, in connection

    fnc(conn_name)

TypeError: 'str' object is not callable

但是,如果我手动制作一个dict并运行它,那么我没有任何问题和功能按预期工作:

d_fncs_expected = {'1': function1, '2': function2, ....}

现在我得到的是:

d_fncs = {'1': 'function1', '2': 'function2', ....}

....我能做些什么来让字典以某种方式工作,以便我可以调用这些函数?我希望值不是字符串而是类型:class

1 个答案:

答案 0 :(得分:0)

替换

fnc(conn_name)

eval(fnc)(conn_name) # or eval(fnc(conn_name))

globals()[fnc](conn_name)

例如

def myfn(arg):
    print(arg +" is printed")
d = {1: 'myfn'}
fun_name = d[1] # 'myfn' 

>>>fun_name("something")
TypeError: 'str' object is not callable
>>>eval(fun_name)("something")
something is printed
>>>globals()[fun_name]("someting")
something is printed