如何检查python函数输出并将其分配给变量而不执行该函数两次?

时间:2017-03-15 21:22:31

标签: python design-patterns

假设我想做以下

def calculate_something_extremally_resource_consuming():
    # execute some api calls and make insane calculations
    if calculations_sucessfull:
        return result

同时在项目的其他地方:

if calculate_something_extremally_resource_consuming():
    a = calculate_something_extremally_resource_consuming()
    etc...

看起来这个重函数会被调用两次,这真的很糟糕。我能想象的另一种选择:

a = calculate_something_extremally_resource_consuming()
if a:
    etc...

也许有一种更优雅的方式?

2 个答案:

答案 0 :(得分:3)

functools.lru_cache有时可以帮助您:

  

Decorator用一个memoizing callable来包装一个函数,该函数可以保存maxsize最近的调用。当使用相同的参数定期调用昂贵的或I / O绑定函数时,它可以节省时间。

>>> from functools import lru_cache
>>> from time import sleep
>>> @lru_cache()
... def expensive_potato():
...     print('reticulating splines...')
...     sleep(2)
...     return 'potato'
... 
>>> expensive_potato()
reticulating splines...
'potato'
>>> expensive_potato()
'potato'

这是Python 3.2中的新功能。如果您使用的是旧Python,则可以轻松编写自己的装饰器。

如果您正在使用类的方法/属性,cached_property很有用。

答案 1 :(得分:0)

在某些语言中,您可以将变量指定为条件块的一部分,但在Python中则不可能(请参阅Can we have assignment in a condition?