如何在Python中动态调用函数?

6 投票
9 回答
9350 浏览
提问于 2025-04-16 06:04

我想做类似这样的事情:

dct = ['do_this', 'do_that']
dct[0]() // call do_this

但是你不能把字符串当作函数来调用(这样会报错)。

我该如何在不切换和不使用一堆函数或lambda表达式的情况下实现这个呢?

我想明确地通过名字来引用这个函数。

9 个回答

3

如果这些东西在一个模块里,你可以用 getattr 来获取它们;如果它们在全局命名空间里,你可以用 globals()

dct = ['do_this', 'do_that']

getattr(my_module, dct[0])()

globals()[dct[0]]()
13

在Python中,函数被视为一等公民

def do_this():
    pass

def do_that():
    pass

dct = [do_this, do_that]
dct[0]()  # calls do_this()

如果dct一定要是一个字符串列表,我会选择使用eval()

eval(dct[0] + "()")

虽然这样做不太优雅,但在合适的模块中在globals()getattr()之间切换会很麻烦。

10

函数是第一类对象。这意味着函数可以像其他任何东西一样被使用和操作。比如这样:

def do_this():
    print "In do_this"

def do_that():
    print "In do_that"

dct = [do_this, do_that]
dct[0]()

如果你真的想从一个字符串列表中调用这些函数,可以使用globals()这个方法:

dct = ['do_this', 'do_that']
globals()[dct[0]]()

不过我建议你不要用globals()(或者locals())来解决你的问题。这不是Python推荐的做法。你可以试试理解一下Python的哲学:>>> import this

撰写回答