是否可以在具有以下功能的受保护环境中调用函数:如果调用函数f
引发异常,则确保所有(外部)变量都恢复到以前的值。
例如,以下代码:
a = 42
def f():
global a
a += 1
error
f()
在引发异常之前,显然会将a设置为43。我想构建一些try/except
结构来调用f()
,其中异常会将局部变量恢复到以前的状态。
我当然想到了一些与sys._getframe(1).f_locals
有关的东西。有可能吗?它可以移植到不同版本的Python中吗?等
目前没有主要目标;只是对这个想法感到好奇。
简短的回答是否定的,这些执行没有快照功能,因此无法恢复变量。
然而,你也可以做一些事情。其中之一是:
(我边写边写,所以如果你在大变量上使用它,这个将是解决你的问题的耗尽资源的方法。)
from pickle import load, dump
def snapshot(v):
with open('snapshot.bin', 'wb') as fh:
dump(v, fh)
def restore():
with open('snapshot.bin', 'rb') as fh:
v = load(fh)
return v
a = 42
snapshot(a)
def f():
global a
a += 1
error
try:
f()
except:
a = restore()
如果这是一个具有初始化值的类,您还可以对整个类或其内部的峰值进行快照,并提取某些变量。但没有办法自动为你做这些事情。
当然,这需要你提前知道哪些变量会受到影响,我不确定是否有办法"在函数内部达到峰值",并查看将使用哪些变量名称,即使这样,你也必须使用traceback
调用来查看在哪一行出现错误并基于此进行恢复。
解决这个问题的一种方法是,将我所有的关键变量存储在一个字典中,并快照该字典或整个字典本身的分支。