我经常在Python中进行交互式工作,涉及一些我不想经常重复的昂贵操作.我通常运行我正在处理的任何Python文件.
如果我写:
import functools32
@functools32.lru_cache()
def square(x):
print "Squaring", x
return x*x
Run Code Online (Sandbox Code Playgroud)
我得到这个行为:
>>> square(10)
Squaring 10
100
>>> square(10)
100
>>> runfile(...)
>>> square(10)
Squaring 10
100
Run Code Online (Sandbox Code Playgroud)
也就是说,重新运行文件会清除缓存.这有效:
try:
safe_square
except NameError:
@functools32.lru_cache()
def safe_square(x):
print "Squaring", x
return x*x
Run Code Online (Sandbox Code Playgroud)
但是当函数很长时,将它的定义放在一个try块中感觉很奇怪.我可以这样做:
def _square(x):
print "Squaring", x
return x*x
try:
safe_square_2
except NameError:
safe_square_2 = functools32.lru_cache()(_square)
Run Code Online (Sandbox Code Playgroud)
但感觉非常人为(例如,在没有'@'符号的情况下调用装饰器)
是否有一种简单的方法来处理这个问题,例如:
@non_resetting_lru_cache()
def square(x):
print "Squaring", x
return x*x
Run Code Online (Sandbox Code Playgroud)
?