我如何在Python中实现两个装饰器,这两个装饰器最终都想调用调用函数

时间:2011-08-06 05:37:47

标签: python design-patterns decorator

我正在尝试使用Python装饰器来简化我的Web应用程序处理程序。

基本上我想使用装饰器来抽象检查经过身份验证的会话的代码,另一个用来检查缓存提供程序(本例中的Memcache)是否有合适的响应。

使用装饰器考虑此方法定义:

@auth.login_required
@cache.clear
def post(self, facility_type_id = None):

auth.login_required检查用户是否已登录,否则返回相应的错误消息,或执行原始函数。

cache.clear会在执行调用方法之前检查缓存是否有特定的密钥并删除它。

auth.login_required和cache.clear都希望最终执行调用方法(post)。

从我读过的内容来看,我现在正在做的事情会执行两次调用方法(post)。

我的问题是,我如何链接最终执行调用方法的装饰器,但确保它只被调用一次。

感谢任何指示,感谢您的时间。

2 个答案:

答案 0 :(得分:4)

每个连续的装饰器接收先前包装的函数,因此函数本身仅在链的末尾被调用一次。这是一个简单的例子:

def dec1(f):
    def wrapped():
        print 'dec1'
        return f()
    return wrapped

def dec2(f):
    def wrapped():
        print 'dec2'
        return f()
    return wrapped

@dec2
@dec1
def spam(): print 'spam'

>>> spam()
dec2
dec1
spam

答案 1 :(得分:1)

你不明白装饰者是如何工作的。

两个装饰者已经“排序”了。外部函数将作为函数接收已经装饰的函数。内部函数不会被调用两次。

相关问题