为什么默认值总是在Python中计算?

时间:2017-05-09 13:26:54

标签: python dictionary default pop

我们说我有一个字典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()

但这有点麻烦。你有什么建议吗?

1 个答案:

答案 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>