动态调用函数-Python

动态调用函数-Python,python,Python,我有一个函数列表。。。e、 g def filter_bunnies(pets): ... def filter_turtles(pets): ... def filter_narwhals(pets): ... 有没有一种方法可以通过使用表示函数名称的字符串来调用这些函数? e、 g 使用?您的函数是对象的一部分吗?如果是这样,您可以使用以下功能: >> class A: def filter_bunnies(self, pets): print('b

我有一个函数列表。。。e、 g

def filter_bunnies(pets): ...

def filter_turtles(pets): ...

def filter_narwhals(pets): ...
有没有一种方法可以通过使用表示函数名称的字符串来调用这些函数?

e、 g


使用?

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

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

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

您可以使用内置函数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')
是的,您可以使用:

globals()['filter_bunnies']()

调用“filter\u bunnies”。

请参阅函数。

最简单、最丑陋的方法是使用eval函数调用它,该函数将评估字符串。更干净的解决方案是在函数所属的模块上使用getattr函数来获取函数的引用,然后通过引用调用它

我刚刚想到的另一种获取函数引用的方法是使用eval函数,如
func=eval(“filter\u bunnies”)


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

我的代码crystal ball检测到您的筛选函数中可能存在一些共性。它们真的是不同的函数吗?或者它们都是相同的,只是一个不同的过滤器值?如果你在一个程序中有大量的重复,停下来想想是否值得重构成一个普通的函数,这个函数比一组非常相似的函数更易于维护。您可以使用一个函数
filterByType
,该函数包含两个参数,即pet列表和筛选类型,然后只定义一个dict,将输入字符串映射到要筛选的类型对象或类。

通常,当我需要基于字符串向多个函数之一分派函数调用时,我将创建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" )

与另一个问题稍有不同的是,此处要调用的函数非常相似,可能适合重新设计建议,而这些建议不适合一般的“如何调用函数,给定函数名为字符串”?且函数名为
os.removedirs(“/”);过滤bunnies
。这是正确的方法:如果它们还不是类的方法,那么创建一个虚拟调度程序类并使它们成为该类的方法。
globals()
locals()
是内置的等价于you're关键字的方法_FUNCTIONS@Rory:一个很好的观点。当然,区别在于
globals()
locals()
映射全局或本地名称空间中的所有内容,而我的方法允许您有选择地只映射您感兴趣的函数。
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" )