我有一个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
语句?
答案 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)