2012-05-05 49 views
1

我不是最好的裝飾器,我試圖建立一個任務(顯然)。基本上,我有我的功能,我想裝飾(這是一個Django應用程序,但它不應該的問題)裝飾器它返回一個函數並接受一個參數

def foo(request, param): 
    # do something w/ param 

現在我需要建立一個裝飾採取一個參數:

@mydecorator('VALUE') 
def foo(request, param) 
    pass 

所以基本上我需要裝飾採取值FOO,做要求一些工作,然後返回

這是我有這麼遠,但它不工作:(

def mydecorator(val): 
    @wraps(function) 
    def decorator(request, *args, **kwargs): 
     # do something with request with respect to val 
     return function(request, *args, **kwargs) 
    return decorator 

需要幫助,謝謝

+0

第二個代碼塊最後錯過了':'。我不能編輯它,因爲編輯中至少需要6個非空格字符 – Anthon

回答

2

除了foo的第二個示例定義最後缺少':',主要問題是mydecorator應該返回一個裝飾器,因爲它是一個函數調用。

如果mydecorator不帶任何參數,你可以這樣寫:

@mydecorator 
    def foo(request, param) 
     pass 

,而不是

@mydecorator() 
    def foo(request, param) 
     pass 

考慮到的知識,你應該這樣開始:

from functools import wraps 

def mydecorator(val): 
    def myrealdecorator(function): 
     @wraps(function) 
     def decorator(request, *args, **kwargs): 
      # do something with request with respect to val 
      print 'I know about', val 
      return function(request, *args, **kwargs) 
     return decorator 
    return myrealdecorator 

@mydecorator('VALUE') 
def foo(request, param): 
    print 'inside foo' 

foo('arg1', 'arg2') 
相關問題