通过输入字符串引用Python函数

时间:2019-06-02 16:01:49

标签: python python-3.x module

我有一个Python模块,其中包含多个函数,并且应根据用户输入调用不同的函数。例如,在我的代码中,我有类似的内容:

if val == "X":
    return foo.X(self)
elif val == "Y":
    return foo.Y(self)
elif val == "Z":
    return foo.Z(self)
else:
    sys.exit("ERROR: value %s DNE"%(val))

有没有一种方法可以直接基于输入直接在foo模块中调用python函数,而无需多个if语句?

2 个答案:

答案 0 :(得分:2)

使用getattr

class Foo:
    def X(self): return 1
    def Y(self): return 2

foo = Foo()
getattr(foo, 'X')()
1

之所以可行,是因为函数也是对象的属性。然后可以正常调用该函数。

但是请注意,您将要处理传递的字符串与Foo中的任何函数都不匹配的情况。在这种情况下,可以将getattr与可选的第三个参数一起使用:

getattr(foo, 'abcd', lambda : None)()
# None

未找到具有该名称的属性时,将返回lambda。

答案 1 :(得分:0)

您可以使用通常的Python方式来避免其他语言(字典)中使用的switch语句。函数是对象,因此函数可以是字典中的值。

function_dict = {'X': foo.X, 'Y': foo:Y, 'Z': foo.Z}
return function_dict[val](self)

如果val不是字典中的键之一,将引发错误。如果您不希望出现该特定错误,则有几种方法可以引发另一个错误或完全避免错误。例如,如果键不在词典中,则可以使用get词典方法来使用默认值。例如,如果您希望为foo.other以外的任何键调用方法X, Y, Z,则可以使用

function_dict = {'X': foo.X, 'Y': foo:Y, 'Z': foo.Z}
return function_dict.get(val, other)(self)

您还可以在使用字典之前检查val是否为键之一,如

function_dict = {'X': foo.X, 'Y': foo:Y, 'Z': foo.Z}
if val not in function_dict:
    sys.exit("ERROR: value %s DNE"%(val))
return function_dict[val](self)