最后使用:删除在try中定义的临时变量:except:block

时间:2017-12-10 11:00:23

标签: python

我正在使用python错误处理指令。在我的脚本中,我有一些try块,使用了一些临时变量,它同样适用于except块。

我想在del块中使用finally语句(或类似内容)来清除tryexcept内创建的所有变量。

问题在于,由于我不知道该程序是否可能会失败,因此我并不完全了解创建的先验。

有没有一种优雅的方式来获得它?提前致谢

2 个答案:

答案 0 :(得分:2)

正如其他人所指出的那样,您可以使用locals()来检查变量的存在,但问题仍然是您希望这样做的原因。

我能想象的一个原因是你要确保释放不再需要的大对象的内存。为此,您只需将None指定给变量即可。

try:
    a = VeryLargeObject()
    b = AnotherVeryLargeObject()
    ...
finally:
    a = b = None

但是,如果此代码封装在函数中,则只要函数返回,内存就会被释放。

话虽如此,除非遇到实际的内存问题,否则我不会使用手动“内存管理”来混乱我的代码。

在@JonClements评论之后

编辑,我想澄清一下:将None分配给名称,就像del一样,实际上并不删除引用的对象名称,它只是删除引用。在此示例中,将不会释放引用的对象a,因为仍然会从全局列表中引用该对象:

global_list = []

try:
    a = VeryLargeObject()
    global_list.append(a)
    b = AnotherVeryLargeObject()
    ...
finally:
    a = b = None

答案 1 :(得分:1)

您可以复制locals() dict并比较之前和之后的内容,以了解您需要删除的内容。这可能不赞成,但它应该做你想要的。

a = 3
b = '4'

snapshot = None # make sure snapshot is included in itself
snapshot = locals().copy()
try:
    c = 5
    assert False
except AssertionError:
    d = []
finally:
    for variable in list(locals()):
        if variable not in snapshot:
            del locals()[variable]
    del locals()['snapshot'] # optional

assert 'a' in locals()
assert 'b' in locals()
assert 'c' not in locals()
assert 'd' not in locals()
assert 'snapshot' not in locals()