如何从字符串构造和调用函数? 例如,考虑三个不同的函数和一个字符串列表,我希望能够使用字符串列表中的项来构造和调用相应的函数
def do_function1():
return 'done function1'
def do_function2():
return 'done function2'
def do_function3():
return 'done function3'
listOfstr = ['function1','function2','function3']
for item in listOfstr:
result = 'do_'+item()
print(result)
result = 'do_'+item()
TypeError: 'str' object is not callable
答案 0 :(得分:2)
有问题的代码是
listOfstr = ['function1','function2','function3']
for item in listOfstr:
result = 'do_'+item()
在第一个循环item
中,将具有值'function1'
。您正在调用此字符串,就好像它是一个函数一样。但字符串不可调用,也没有分配代码!
然后,在做任何事情之前继续使用for循环。
只需参考item
,就像这样:
for item in listOfstr:
func_name = 'do_' + item
func = globals()[func_name]
func()
答案 1 :(得分:2)
最明确的方法是拥有这些功能的字典:
funcs = {
'function1': do_function1,
'function2': do_function2,
'function3': do_function3,
}
funcs[item]()
通过这种方式,您还可以根据需要为您的功能命名,从项目名称中分离,制作方法,移动到其他模块等,而不会破坏一般设计。另一种方式是全局,正如已经回答的那样。
答案 2 :(得分:1)
首先,通常你不会需要这个。您也可以将函数本身放在如下列表中,而不是将字符串放在列表中:
def do_function1():
return 'done function1'
def do_function2():
return 'done function2'
def do_function3():
return 'done function3'
list_of_functions = [do_function1, do_function2, do_function3]
for item in list_of_functions:
result = item()
print(result)
但是,如果你坚持,你可以这样做:
locals()["do_function1"]()
locals()
按名称为您提供本地定义对象的字典。