我有一系列功能......例如
def filter_bunnies(pets): ...
def filter_turtles(pets): ...
def filter_narwhals(pets): ...
有没有办法通过使用代表其名称的字符串来调用这些函数?
e.g。
'filter_bunnies', 'filter_turtles', 'filter_narwhals'
答案 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" )