将lru_cache应用于Django模板过滤器

时间:2016-04-10 01:46:16

标签: python django

我正在尝试定义lru_cache - ed模板过滤器。

Django检查功能代码以验证模板中过滤器调用的适当性,但lru_cache涵盖了我的真实签名,因此调用此类过滤器总是失败

%s requires 0 arguments, %d provided

错误。

Django 1.8.11,Python 2.7.10。意味着我没有functools.lru_cache,而是使用Django的兼容版本:django.utils.functional.lru_cache

示例:

from django.tepmlate import Library
from django.utils.functional import lru_cache

register = Library()

@register.filter
@lru_cache()
def my_filter(foobar):
    # do complex foobar stuff..
    return foobar ** 2

我认为functools.wraps能够以某种方式帮助我,但它只对浅层内省有好处 - 像__name__等属性,或者我的“wraps - fu”很弱。

显然我可以用lru_cache定义一个单独的函数,并在真正的过滤函数中正常调用它:

@lru_cache()
def _my_filter(foobar):
    # do complex foobar stuff...
    return foobar ** 2

@register.filter
def my_filter(foobar):
    return _my_filter(foobar)

问题:有更优雅的方法吗?例如,不必创建另一个函数?

0 个答案:

没有答案