背景:
我正在阅读一个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
答案 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