我们说我有一个字典d
,其中包含密钥0或密钥1.我想将x
分配给值d[0]
(如果存在)否则d[1]
。如果它存在,我也想要销毁密钥0。我会写:
x = d.pop(0,d[1])
但是为d = {0:'a'}
运行此操作会引发错误。
同样地,我们假设我有一个带有关键字参数x
的函数。如果已经计算x
,那么我想使用给定的值。否则,我需要计算它。
import time
def long_calculation():
time.sleep(10)
return 'waited'
def func(**kwargs):
x = kwargs.pop('x',long_calculation())
return x
运行f(x='test')
需要10秒钟。
我可以做类似
的事情 x = kwargs.pop('x',None)
if x is None:
x = long_calculation()
但这有点麻烦。你有什么建议吗?
答案 0 :(得分:0)
有关缓存功能的结果,请查看functools.lru_cache。示例:
from functools import lru_cache
@lru_cache(maxsize=32)
def long_calculation():
time.sleep(10)
return 'waited'
第二个调用返回缓存的值:
print(long_calculation()) # 10 seconds
print(long_calculation()) # instant
如果您只想短路dict.pop()
,我认为将它放在嵌套的try
块中更为直接。喜欢:
try:
d.pop(0)
except KeyError:
try:
d[1]
except KeyError:
<expensive value>