在Python中,如何执行作为列表函数的对象?
我对Python相当陌生,似乎无法让它工作。我有一个列表,其中有一个嵌入的对象列表,这些对象是函数的名称,我需要执行对象列表。我有调用函数列表的函数。我想更改它,这样我就可以直接调用函数列表,而无需调用其他函数在Python中,如何执行作为列表函数的对象?,python,Python,我对Python相当陌生,似乎无法让它工作。我有一个列表,其中有一个嵌入的对象列表,这些对象是函数的名称,我需要执行对象列表。我有调用函数列表的函数。我想更改它,这样我就可以直接调用函数列表,而无需调用其他函数 validActions=[ ['Refresh','Environment Refresh',Refresh], ['Retire','Environment Retire Storage', [ doStatusDecommission, doPauseJ
validActions=[
['Refresh','Environment Refresh',Refresh],
['Retire','Environment Retire Storage',
[ doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected]],
['Provision','Environment Provision Storage',Provision]
]
def updateEnv(ctx):
for actionVal,actionDesc,actionFunction in validActions:
if ctx["newAction"] == actionVal:
actionFunction()
如果我调用“刷新”或“提供”,因为它们是函数,那么这就可以工作。但是,当我调用“Retire”列表并且错误消息为
TypeError: 'list' object is not callable
列出所有这些列表,然后依次迭代执行每个列表
for actionVal,actionDesc,actionFunctions in validActions:
if ctx["newAction"] == actionVal:
for actionFunction in actionFunctions:
actionFunction()
列出所有这些列表,然后依次迭代执行每个列表
for actionVal,actionDesc,actionFunctions in validActions:
if ctx["newAction"] == actionVal:
for actionFunction in actionFunctions:
actionFunction()
按名称获取函数的步骤 如果此模块中定义了功能:
globals().get(actionFunctionName)(args)
如果在其他模块或类中:
getattr(class_or_module,actionFunctionName)(args)
按名称获取函数的步骤 如果此模块中定义了功能:
globals().get(actionFunctionName)(args)
如果在其他模块或类中:
getattr(class_or_module,actionFunctionName)(args)
您仍然可以调用列表中的每个函数。如果列出所有条目,则处理这两种情况会变得更容易:
validActions=[
['Refresh','Environment Refresh', [Refresh]],
['Retire','Environment Retire Storage', [
doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected
]],
['Provision', 'Environment Provision Storage', [Provision]]
]
def updateEnv(ctx):
for actionVal, actionDesc, actionFunctions in validActions:
if ctx["newAction"] == actionVal:
for action_function in actionFunctions:
action_function()
如果您所做的只是查找与ctx['newAction']
匹配的一个操作,那么最好使用字典,直接从该*中查找actionDesc
和actionFunctions
项:
validActions = {
'Refresh': ('Environment Refresh', (Refresh,)),
'Retire': ('Environment Retire Storage', (
doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected
),
'Provision': ('Environment Provision Storage', (Provision,)),
}
def updateEnv(ctx):
actionDesc, actionFunctions = validActions[ctx["newAction"]]
for action_function in actionFunctions:
action_function()
您仍然可以调用列表中的每个函数。如果列出所有条目,则处理这两种情况会变得更容易:
validActions=[
['Refresh','Environment Refresh', [Refresh]],
['Retire','Environment Retire Storage', [
doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected
]],
['Provision', 'Environment Provision Storage', [Provision]]
]
def updateEnv(ctx):
for actionVal, actionDesc, actionFunctions in validActions:
if ctx["newAction"] == actionVal:
for action_function in actionFunctions:
action_function()
如果您所做的只是查找与ctx['newAction']
匹配的一个操作,那么最好使用字典,直接从该*中查找actionDesc
和actionFunctions
项:
validActions = {
'Refresh': ('Environment Refresh', (Refresh,)),
'Retire': ('Environment Retire Storage', (
doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected
),
'Provision': ('Environment Provision Storage', (Provision,)),
}
def updateEnv(ctx):
actionDesc, actionFunctions = validActions[ctx["newAction"]]
for action_function in actionFunctions:
action_function()
一种选择是让每个列表以函数列表结尾,即使该列表只有一个元素
validActions=[
['Refresh','Environment Refresh', [Refresh]], #note brackets around Refresh
['Retire','Environment Retire Storage',
[ doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected]],
['Provision','Environment Provision Storage',[Provision]]
]
def updateEnv(ctx):
for actionVal,actionDesc,actionFunctions in validActions:
if ctx["newAction"] == actionVal:
for func in actionFunctions:
func()
或者创建一个新函数,调用所有4个函数
def retireFunctions():
doStatusDecommission()
doPauseJobBeforeStart()
doRetireStorage()
doStatusDisconnected()
validActions=[
['Refresh','Environment Refresh',Refresh],
['Retire','Environment Retire Storage', retireFunctions],
['Provision','Environment Provision Storage',Provision]
]
或者最后一个选项是型式试验(不推荐)
一种选择是让每个列表以函数列表结尾,即使该列表只有一个元素
validActions=[
['Refresh','Environment Refresh', [Refresh]], #note brackets around Refresh
['Retire','Environment Retire Storage',
[ doStatusDecommission,
doPauseJobBeforeStart,
doRetireStorage,
doStatusDisconnected]],
['Provision','Environment Provision Storage',[Provision]]
]
def updateEnv(ctx):
for actionVal,actionDesc,actionFunctions in validActions:
if ctx["newAction"] == actionVal:
for func in actionFunctions:
func()
或者创建一个新函数,调用所有4个函数
def retireFunctions():
doStatusDecommission()
doPauseJobBeforeStart()
doRetireStorage()
doStatusDisconnected()
validActions=[
['Refresh','Environment Refresh',Refresh],
['Retire','Environment Retire Storage', retireFunctions],
['Provision','Environment Provision Storage',Provision]
]
或者最后一个选项是型式试验(不推荐)
我不想用你定义的列表来填充我的答案,让它看起来更长。我将使用您定义的相同列表
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"]]]
如果您对此有特殊需要或疑问,请随时发表意见。我不想用您定义的列表来填充我的答案,让它看起来更长。我将使用您定义的相同列表
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"]]]
如果您对此有特殊需要或疑问,请随时发表意见。为什么您不能有一个嵌入的函数引用列表?您可以创建另一个函数来调用所有4个函数。@Asad:它们已经存在了;“这个标题是不准确的。”伊格纳西奥瓦茨克斯·艾布拉姆斯我承认我只是浏览了一下尸体,但现在看着它,我更加困惑了。其中有些是字符串,有些是引用(可能是对函子的引用)。有模式吗?编辑:我现在看到了。@Asad:第三个元素。为什么不能有一个嵌入的函数引用列表?您可以创建另一个函数,调用所有4个函数。@Asad:它们已经存在了;“这个标题是不准确的。”伊格纳西奥瓦茨克斯·艾布拉姆斯我承认我只是浏览了一下尸体,但现在看着它,我更加困惑了。其中有些是字符串,有些是引用(可能是对函子的引用)。有模式吗?编辑:我现在看到了。@Asad:第三个元素。对象已经是函数了。它们不是字符串命名函数。标题有误导性。问题被重写了几次。我在阅读问题后调整了标题;在我对你的答案发表评论后,我进行了编辑。这是对该问题进行的唯一编辑。对象已经是函数。它们不是字符串命名函数。标题有误导性。问题被重写了几次。我在阅读问题后调整了标题;在我对你的答案发表评论后,我进行了编辑。这是对这个问题所做的唯一编辑。我认为OP也在浪费资源,因为它使用了一个列表并在其中循环查找一个由
ctx[“newAction”]
确定的“actionVal”。OP应该使用一个函子列表字典。我认为OP也在浪费资源,因为它使用一个列表并在其中循环查找一个由ctx[“newAction”]
确定的“actionVal”。OP应该使用一个函子列表字典。我已经有了一个解决方案,其中一个函数调用其他函数,但我正在远离它,这样我就可以跟踪在一个地方调用的所有函数。用函数列表结束每个列表对于我需要的实现是有效的。谢谢。我已经有了一个解决方案,其中我有一个函数调用其他函数