如果发生异常,则将外部作用域中的变量还原为以前的值



是否可以在具有以下功能的受保护环境中调用函数:如果调用函数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调用来查看在哪一行出现错误并基于此进行恢复。

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

相关内容

  • 没有找到相关文章