如果发生异常,则将变量从外部范围恢复到先前的值

时间:2015-11-17 15:16:24

标签: python exception scope global-variables

是否可以使用以下功能在一种受保护环境中调用函数:如果调用函数f引发异常,则确保所有(外部)变量都恢复为先前的值

例如,以下代码:

a = 42
def f():
  global a
  a += 1
  error
f()
在提出异常之前,

显然会将a设置为43。我想构建一些try/except结构来调用f(),其中异常会将局部变量恢复到之前的状态。

当然我想到了与sys._getframe(1).f_locals相关的事情。可能吗?它是否可以在不同版本的Python中移植?等

目前没有重大目标;只是好奇这个想法。

1 个答案:

答案 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调用来查看您获得错误的行,并根据该行进行恢复。

我要解决的一种方法是将所有关键变量存储在该字典的字典和快照分支或整个字典本身中。