小编典典

是否有一个装饰器可以简单地缓存函数返回值?

all

考虑以下:

@property
def name(self):

    if not hasattr(self, '_name'):

        # expensive calculation
        self._name = 1 + 1

    return self._name

我是新手,但我认为缓存可以分解为装饰器。只是我没有找到喜欢的;)

PS真正的计算不依赖于可变值


阅读 59

收藏
2022-06-15

共1个答案

小编典典

Python 3.8functools.cached_property装饰器

https://docs.python.org/dev/library/functools.html#functools.cached_property

这个装饰器可以被看作是缓存,或者当你没有任何参数时@property作为一个清洁器 。@functools.lru_cache

文档说:

@functools.cached_property(func)

将类的方法转换为属性,其值被计算一次,然后在实例的生命周期内作为普通属性缓存。与 property()
类似,但增加了缓存。对于实例的昂贵计算属性很有用,否则这些属性实际上是不可变的。

例子:

class DataSet:
    def __init__(self, sequence_of_numbers):
        self._data = sequence_of_numbers

    @cached_property
    def stdev(self):
        return statistics.stdev(self._data)

    @cached_property
    def variance(self):
        return statistics.variance(self._data)

3.8 版中的新功能。

注意此装饰器要求每个实例上的 dict 属性是可变映射。这意味着它不适用于某些类型,例如元类(因为类型实例上的 dict
属性是类名称空间的只读代理),以及那些指定 插槽 而不包括 dict 作为已定义插槽之一的类型(如此类根本不提供 dict
属性)。

2022-06-15