Python for-loop 在引发异常的情况下撤消所有进程

Python for-loop undo all processes in case of raised Exception

小例子:

x = ['idjs', 'w', '2331']
fin = []
for row in x:
    try:
        fin.append(row)
        fin.append(row[1])
    except:
        continue

print(fin)

Output: ['idjs', 'd', 'w', '2331', '3']

在上述情况下,当 row='w'fin.append(row[1])
时引发异常 是否有可能在for循环中某个组件引发异常时,之前的多个进程也撤消了它们的操作?
循环中可以有多个进程,这只是一个例子。有没有办法在不特别提及它们并删除组件的情况下处理所有问题?
预期输出:['idjs', 'd', '2331', '3']

也许使用 list.extend 而不是追加两次:

x = ['idjs', 'w', '2331']
fin = []
for row in x:
    try:
        fin.extend([row, row[1]])
    except:
        continue

输出:

['idjs', 'd', '2331', '3']

在您给出的简单示例中,enke 建议使用 extend 是最简单的

在更复杂的代码中,听起来几乎就像你想要一个 ExitStack;这将让你注册 clean-up ,它在你退出上下文时被调用,它可能是 built-in (例如关闭文件,释放锁)或自定义(调用一个函数,有或没有关于异常的信息)

手册中的一个稍微简化的例子:

files = []
with ExitStack() as stack:
    for fname in filenames:
        files.append(stack.enter_context(open(fname)))

这将打开所有文件,但如果其中任何文件无法打开(未找到),所有 already-opened 个文件将自动关闭。

您还可以注册要调用的函数作为 clean-up:

的一部分
    stack.callback(lambda: print("Exiting the stack"))

另一种选择(或组合),取决于您在这 20 个步骤中所做的事情,您可以采取这些步骤并将它们放入它们自己的函数中,或者 class 并使其成为上下文管理器。这会让你确保 set-up 和 clean-up 总是以 matched-up 的方式发生,而不会弄乱你的主代码。

x = ['.', 'w', '2331']
fin = []
for row in x:
    B=fin.copy()
    try:
        fin.append(row)
        fin.append(row[1])
    except:
        fin=B.copy()

解决方案是在每次迭代时创建一个list的副本,如果出现异常我们可以将之前复制的list复制到原始list。