假设我有一些代码可以创建多个变量:
# Some code
# Beginning of the block to memoize
a = foo()
b = bar()
...
c =
# End of the block to memoize
# ... some more code
我想 memoize 上面的整个块,而不必明确关于块中创建/更改的每个变量或手动腌制它们。我怎么能用Python做到这一点?
理想情况下,我希望能够使用某些内容(if/else
或with
语句)来包装它,并且如果需要,可以使用强制刷新的标志。
在概念上说,它会像:
# Some code
# Flag that I can set from outside to save or force a reset of the chache
refresh_cache = True
if refresh_cache == False
load_cache_of_block()
else:
# Beginning of the block to memoize
a = foo()
b = bar()
...
c = stuff()
# End of the block to memoize
save_cache_of_block()
# ... some more code
有没有办法做到这一点,而无需明确挑选代码中定义或更改的每个变量? (即在我们保存的第一次运行结束时,我们稍后只重用这些值)
答案 0 :(得分:1)
有很多方法可以解决这个问题,但我认为与你所描述的最接近的方式是使用pythons module scope
作为你的memoized和{{1}或根据需要import
。像这样:
reload
使用"变量范围"作为模块# a.py
import b
print b.a, b.b
b.func(5)
b.b = 'world'
print b.a, b.b
if b.needs_refresh():
reload(b)
print b.a, b.b
:
b
执行此操作会产生您期望的结果:
# b.py
a = 0
b = 'hello'
def func(i):
global a
a += i
def needs_refresh():
return a >= 5
编辑:允许您复制并保存整个范围,您可以使用类范围:
0 hello
5 world
0 hello
答案 1 :(得分:1)
如何使用locals()
获取局部变量列表,将它们存储在pickle中的dict中,然后使用(下面更概念化):
for k,v in vars_from_pickle:
run_string = '%s=%s' % (k,v)
exec(run_string)
恢复本地堆栈。也许最好使用列表而不是字典来保持堆栈排序。