从字符串构造可调用函数

2024-06-16 15:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从字符串构造和调用函数? 例如,考虑三个不同的函数和一个字符串列表,我希望能够使用字符串列表中的项来构造和调用相应的函数

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

Tags: 函数字符串列表forreturndefresultitem
3条回答

首先,通常你不需要这个。除了将字符串放在列表中,还可以将函数本身放在如下列表中:

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()按名称提供本地定义对象的字典。你知道吗

有问题的代码是

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()

最明确的方法是建立这些函数的字典:

funcs = {
    'function1': do_function1,
    'function2': do_function2,
    'function3': do_function3,
}

funcs[item]()

这样,你也可以随意命名你的函数,与项目名称分离,使它们成为方法,移动到其他模块等等,而不破坏一般的设计。另一种方式是全局的,正如已经回答的那样。你知道吗

相关问题 更多 >