动态调用函数 - Python

时间:2010-05-12 11:53:09

标签: python

我有一系列功能......例如

def filter_bunnies(pets): ...

def filter_turtles(pets): ...

def filter_narwhals(pets): ...

有没有办法通过使用代表其名称的字符串来调用这些函数?

e.g。

'filter_bunnies', 'filter_turtles', 'filter_narwhals'

8 个答案:

答案 0 :(得分:10)

你的功能是对象的一部分吗?如果是这样,您可以使用getattr功能:

>> class A:
    def filter_bunnies(self, pets):
        print('bunnies')

>>> getattr(A(), 'filter_bunnies')(1)
bunnies

答案 1 :(得分:4)

是的,您可以使用:

globals()['filter_bunnies']()

调用'filter_bunnies'。

答案 2 :(得分:2)

您可以使用内置函数locals()来获取变量和函数的字典,这是一个示例:

def a(str):
    print("A" + str)

def b(str):
    print("B" + str)

def c(str):
    print("C" + str)

for f in ['a', 'b', 'c']:
    locals()[f]('hello')

答案 3 :(得分:2)

我的代码水晶球检测到您的滤镜功能之间可能存在一些共性。它们真的是不同的功能,还是只有一个不同的过滤器值它们都是一样的?如果你在一个程序中有大量的重复,那就停下来思考是否值得对一个公共函数进行一些重构,这比一组非常相似的函数更容易维护。你可以有一个函数filterByType,它接受​​2个参数,宠物列表和过滤类型,然后定义一个dict来将输入字符串映射到你想要过滤的类型对象或类。

答案 4 :(得分:0)

使用eval

答案 5 :(得分:0)

请参阅eval功能。

答案 6 :(得分:0)

最简单和最丑陋的方法是使用eval函数调用它,它会评估你的字符串。更清晰的解决方案是在函数所属的模块上使用getattr函数获取函数的引用,然后通过引用调用它。

我获得函数引用的另一种方法是使用eval函数,如func = eval("filter_bunnies")

当你使用eval时要小心,特别是如果eval的值依赖于某种用户输入,因为它可能会让你执行不需要的/恶意的代码。

答案 7 :(得分:0)

通常,当我需要根据字符串将函数调用分派给多个函数之一时,我将创建一个dict的函数元素。我已经完成了这个,例如,编写一个简单的解释器,其中每个关键字由不同的函数实现。您甚至可以使用装饰器来优雅地处理作业:

KEYWORD_FUNCTIONS = {}

def MAKE_KEYWORD( f ):
    KEYWORD_FUNCTIONS[ f.func_name ] = f
    return f

@MAKE_KEYWORD
def KEYWORD_A( arg ):
    print "Keyword A with arg %s" % arg

@MAKE_KEYWORD
def KEYWORD_B( arg ):
    print "Keyword B with arg %s" % arg

if __name__ == "__main__":
    KEYWORD_FUNCTIONS[ "KEYWORD_A" ]( "first_argument" )
    KEYWORD_FUNCTIONS[ "KEYWORD_B" ]( "second_argument" )