在Python中,如何执行作为列表函数的对象?

在Python中,如何执行作为列表函数的对象?,python,Python,我对Python相当陌生,似乎无法让它工作。我有一个列表,其中有一个嵌入的对象列表,这些对象是函数的名称,我需要执行对象列表。我有调用函数列表的函数。我想更改它,这样我就可以直接调用函数列表,而无需调用其他函数 validActions=[ ['Refresh','Environment Refresh',Refresh], ['Retire','Environment Retire Storage', [ doStatusDecommission, doPauseJ

我对Python相当陌生,似乎无法让它工作。我有一个列表,其中有一个嵌入的对象列表,这些对象是函数的名称,我需要执行对象列表。我有调用函数列表的函数。我想更改它,这样我就可以直接调用函数列表,而无需调用其他函数

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应该使用一个函子列表字典。我已经有了一个解决方案,其中一个函数调用其他函数,但我正在远离它,这样我就可以跟踪在一个地方调用的所有函数。用函数列表结束每个列表对于我需要的实现是有效的。谢谢。我已经有了一个解决方案,其中我有一个函数调用其他函数