我正在寻找一种更好的方法来调用基于Python中的变量的函数与使用if / else语句(如下所示)。每个状态代码都有相应的功能
if status == 'CONNECT':
return connect(*args, **kwargs)
elif status == 'RAWFEED':
return rawfeed(*args, **kwargs)
elif status == 'RAWCONFIG':
return rawconfig(*args, **kwargs)
elif status == 'TESTFEED':
return testfeed(*args, **kwargs)
...
我认为这需要某种工厂功能,但不确定语法
答案 0 :(得分:39)
你可能会发现getattr
有用,我想
import module
getattr(module, status.lower())(*args, **kwargs)
答案 1 :(得分:19)
执行此操作的规范方法是使用字典模拟switch
或if/elif
。你可以在SO上找到几个类似问题的问题。
将您的函数放入字典中,并将状态代码作为键:
funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}
funcs[status](*args, **kwargs)
答案 2 :(得分:15)
假设这些函数属于某个模块:
import module
return getattr(module, status.lower()).__call__(*args, **kwargs)
答案 3 :(得分:5)
它接缝你可以使用稍微不同的getattr(在我看来更优雅的方式)
import math
getattr(math, 'sin')(1)
或如果导入功能如下
from math import sin
sin现在位于命名空间中,因此您可以通过
调用它vars()['sin'](1)
答案 4 :(得分:4)
对SilentGhost的回答有所改进:
globals()[status.lower()](*args, **kwargs)
如果要调用当前模块中定义的函数。
虽然看起来很难看。我会用字典解决方案。
答案 5 :(得分:3)
答案 6 :(得分:1)
答案 7 :(得分:-1)
与前一个有所不同:
funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}
func = funcs.get('status')
if func:
func(*args, **kwargs)