我不想用您定义的列表填写我的答案以使其看起来更长。我将使用您定义的相同列表。
def updateEnv(ctx):
for actionVal,actionDesc,actionFunctions in validActions:
if ctx["newAction"] == actionVal:
try:
[func() for func in actionFunctions]
except TypeError:
# not iterable
actionFunctions()
except Exception as e:
# iterable, unexpected errors
print e
pass
如果可以修改数据结构,我建议如下:
validActions={
('Refresh','Environment Refresh') : {Refresh},
('Retire','Environment Retire Storage'):
{ doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected } ,
('Provision','Environment Provision Storage'):{Provision}
}
您的函数通常是方法描述符,它们是不可变的。使用 set 作为函数的容器可以大大减少迭代和计数的时间成本。
通过使用字典作为带有元组键的顶级容器,您可以准确地将输入映射到输出。这意味着什么?它的意思是:
def updateEnv(ctx):
[[func() for func in value] if ctx["newAction"] == key[0]
else None
for key, value in validActions.items()]
更有效的是,如果您知道 actionDecs 是 actionVal 独有的,请使用两个单独的映射:
validActions = {
'Refresh' : {Refresh},
'Retire':
{ doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected } ,
'Provision' : {Provision}
}
actionsDescs = {
'Refresh': 'Environment Refresh'
'Retire': 'Environment Retire Storage'
'Provision' : 'Environment Provision Storage'
}
如果您需要从缩写描述,例如调用:
actionsDescs['Refresh']
你的函数迭代变成:
def updateEnv(ctx):
[func() for func in validAction[ctx["newAction"]]]
如果您对此有特定需求或问题,请随时发表评论。