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。
小例子:
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。