繁体   English   中英

记住装饰器未返回实际值

[英]Memoize decorator not returning actual value

我有这个memoize装饰器:

import functools

cache = {}

def memoize(obj):
    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        if args not in cache:
            cache[args] = obj(*args, **kwargs)
        return cache[args]
    return memoizer

在类的任何方法上都可以正常工作。 但是,与@property装饰器一起使用时,会出现以下错误。

AttributeError: 'property' object has no attribute '__module__'

如何使其与类的@property方法一起使用?

提前致谢!

更新

class QClass(object):
    @memoize
    @property
    def positive(self):
        return Predicate('positive')

由于property对象缺少__module__和其他属性,因此应将其装饰器用作最后一个装饰器:

class QClass(object):
    @property
    @memoize
    def positive(self):
        return Predicate('positive')

或者在备忘录装饰器中指定分配的可用属性:

def memoize(obj):
    @functools.wraps(obj, assigned=('__doc__',))
    def memoizer(*args, **kwargs):
        …

我的一位同事回答了这个问题。

装饰器可以这样写:

from functools import update_wrapper
predicate_cache = {}

def cached_property(cache):
    """Create a property, where the lookup is stored in ``cache``"""
    def decorator(method):
        name = method.__name__
        def wrapper(self):
            if name not in cache:
                cache[name] = method(self)
            return cache[name]   
        return property(update_wrapper(wrapper, method))
    return decorator

可以这样使用:

predicate_cache = {}

class QClass(object):
    @cached_property(predicate_cache)
    def positive(self):
        """..."""
        return Predicate("positive")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM