Python缓存装饰器从参数中获取陈旧的值

时间:2019-02-27 03:40:27

标签: python

我有一个python函数,它根据传递的参数来缓存结果。问题是,fval()可以根据其他因素返回不同的值。但是test()仍然向我发送过时的值。如何确保参数vfval()

获取最新值
@cached(60*5)
def test(a,v=fval()):
  print "inside function"
  return a,v

r = test(2)
inside test function
print r
(2, 5)

print fval()
7

r = test(2) . #This time I am expecting v to be 7, but it isnt
print r 
(2,5)

我希望r打印(2,7)。如何确保将最新值作为参数发送到缓存函数?

2 个答案:

答案 0 :(得分:0)

在评估函数for all functions in Python时评估可选值。通常的解决方案是提供一个不代表任何内容的值,然后进行检查:

@cached(60*5)
def test(a, v=None):
    if v is None:
        v = fval()

    print "inside function"
    return a, v

如果在此之后,您还希望cachedfval()的最终值起作用而不是没有第二个参数,则需要执行以下操作:

@cached(60*5)
def _test(a, v):
    print "inside function"
    return a, v

def test(a, v=None):
    if v is None:
        v = fval()

    return _test(a, v)

答案 1 :(得分:0)

是因为这一行:

def test(a,v=fval()):

在Python中,默认参数在函数定义处解析一次。

您可能需要执行以下操作:

def test(a, v=None):
    if v is None:
        v = fval()

    # the rest here