是否可以使用以下功能在一种受保护环境中调用函数:如果调用函数f
引发异常,则确保所有(外部)变量都恢复为先前的值
例如,以下代码:
a = 42
def f():
global a
a += 1
error
f()
在提出异常之前,显然会将a设置为43。我想构建一些try/except
结构来调用f()
,其中异常会将局部变量恢复到之前的状态。
当然我想到了与sys._getframe(1).f_locals
相关的事情。可能吗?它是否可以在不同版本的Python中移植?等
目前没有重大目标;只是好奇这个想法。
答案 0 :(得分:0)
简短回答是否定,这些执行没有快照功能,因此无法恢复变量。
但是你可以做一些事情。其中一个是:
(我正在写这篇文章,所以如果你在大变量上使用它,将成为解决问题的资源。)
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()
如果这是一个具有初始值的类,您还可以对整个类或其中的峰值进行快照并提取某些变量。但是没有办法自动为你做这些事情。
当然这需要你知道一个时间的变量会影响哪些变量,我不确定是否有办法在函数内“达到峰值”并查看将使用哪些变量名称,即便如此d必须使用traceback
调用来查看您获得错误的行,并根据该行进行恢复。
我要解决的一种方法是将所有关键变量存储在该字典的字典和快照分支或整个字典本身中。