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

Python 如果发生异常,将变量从外部范围恢复到以前的值,python,exception,scope,global-variables,Python,Exception,Scope,Global Variables,是否可以在具有以下功能的受保护环境中调用函数:如果调用函数f引发异常,请确保所有(外部)变量都恢复到其以前的值 例如,以下代码: a = 42 def f(): global a a += 1 error f() 在引发异常之前,显然会将a设置为43。我想构建一些try/except结构来调用f(),其中异常会将局部变量恢复到它们以前的状态 当然,我想到了一些与系统相关的东西。可能吗?它是否可以跨不同版本的Python移植?等等 目前没有重大目标;对这个想法很好奇。简短的回答是否定

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

例如,以下代码:

a = 42
def f():
  global a
  a += 1
  error
f()
在引发异常之前,显然会将a设置为43。我想构建一些
try/except
结构来调用
f()
,其中异常会将局部变量恢复到它们以前的状态

当然,我想到了一些与系统相关的东西。可能吗?它是否可以跨不同版本的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()
不过,有些事情你可以做。其中之一是:
(我边写边写,所以如果在大变量上使用它,这将是解决问题的一种消耗资源的方法。)

如果这是一个具有初始值的类,那么还可以快照整个类或其中的峰值,并提取某些变量。但是没有办法自动为你做这些事情

当然,这需要你知道哪些变量会受到影响,我不确定是否有办法“在函数中达到峰值”并查看将使用哪些变量名,即使这样,你也必须使用
回溯
调用来查看哪一行出现了错误并基于此进行了恢复


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

所有(外部)变量应该包括哪些内容???在Python中最接近这一点的可能是使用语句和创建的一般思想。