【问题标题】:Try/except in a list of functions [duplicate]在功能列表中尝试/除 [重复]
【发布时间】:2021-07-22 12:54:55
【问题描述】:

我有一个函数列表。我想遍历列表并尝试其中一个功能是否运行良好而没有错误。我试过这个:

list_functions = [func1(var), func2(var)]

for function in list_functions:
    try:
        function
    except:
        pass
    else:
        break

else:
    raise Exception("No function succeeded.")

但我的代码只尝试了func1,然后失败了。请问如何修复我的代码?

这个问题对我没有帮助:Get a Try statement to loop around until correct value obtained

【问题讨论】:

  • "仅尝试 func1 然后下降" - 因为该函数是在 try...except 块之外调用的。您的函数列表是调用函数的结果列表。
  • 你的代码没有按照你的想法做。当你在这里调用它们时,你的函数就会被执行:list_functions = [func1(var), func2(var)]

标签: python


【解决方案1】:

首先,当您遇到错误时,请提供(并查看!;))完整的回溯。您会看到您的func1 没有在您的try: except: 块中调用,而是在您创建list_functions 时调用。它将包含对func1func2 的调用结果,这些调用在当时进行评估。由于func1 返回错误,执行将在该点停止。

要解决这个问题:你必须在 try: except: 块中调用你的函数,例如这样:

list_functions = [func1, func2]

for function in list_functions:
    try:
        function(var)
    except Exception as exc:
        pass
    else:
        break
else:
    raise Exception("No function succeeded.")

如果您将可变参数传递给每个方法,这可能会稍微复杂一些,但这是可以实现的。

【讨论】:

    【解决方案2】:

    您的代码中的问题是您在定义list_functions 列表时调用了每个函数。尝试将参数分离到一个单独的列表中,并在for 循环中调用每个函数:

    list_functions = [func1, func2]
    list_vars = [var1, var2]
    for function, var in zip(list_functions, list_vars):
        try:
            function(var)
        except:
            pass
        else:
            break
    else:
        raise Exception("No function succeeded.")
    

    如果每个函数的参数都相同,那么zip() 方法以及单独的变量列表将不再需要。只是:

    list_functions = [func1, func2]
    
    for function in list_functions:
        try:
            function(var)
        except:
            pass
        else:
            break
    
    else:
        raise Exception("No function succeeded.")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多