【发布时间】:2020-06-05 14:29:50
【问题描述】:
我正在尝试使用固定字典将各种缓存添加到昂贵的函数中。像这样的:
def func(arg):
if arg in precomputed:
return precomputed[arg]
else:
return expensive_function(arg)
现在如果我可以使用dict.get() 默认值来做这样的事情会更干净一点:
def func(arg):
return precomputed.get(arg, expensive_function(arg))
问题是,expensive_function() 运行无论precomputed.get() 是否成功,所以我们得到了所有的脂肪而不是任何味道。
有没有办法可以在这里推迟对expensive_function() 的调用,以便仅在precomputed_get() 失败时调用它?
【问题讨论】:
-
我认为最 Pythonic 的方式是
try: return pre[arg] except KeyError: return exp_fun(arg)... 为什么它需要单线? -
根据输入,
lru_cache装饰器可能是一种替代解决方案。 -
@deceze 为什么 try-catch 如此 Pythonic?我已经看到它在其他情况下被推荐,但我有点坚持其他语言的“尽可能避免陷入错误处理代码”的心态。不会影响性能吗?
-
我的意思是,其他问题中的解决方案并不能真正帮助您 - 但我可以告诉您,经过 8 年的经验,您最初拥有的简单易读的 if 语句是首先是最好的方法:)
标签: python python-3.x function deferred-execution