2014-01-29 52 views
6

我有一個函數F1:手動調用一個裝飾接受參數

def f1(): 
    return True 

我也有一個裝飾接受參數,可以使用這樣的:

@validate_arguments(arg1, arg2) 

我想手動呼叫f1而不是@(用於測試和重用目的),但似乎不起作用。

因此,像:

validate_arguments(f1, arg1, arg2) 

它不工作的原因是因爲validate_arguments是需要的參數作爲參數的功能,幷包含一個閉包是實際的裝飾。

有沒有辦法做我想要的?要在不帶@的函數上手動調用裝飾器,需要一個裝飾器來接受參數?

回答

11

你需要的東西,如:

def f1(): 
    return True 
f1 = validate_arguments(arg1, arg2)(f1) 

這裏validate_arguments(arg1, arg2)返回實際的裝飾,該裝飾我們傳遞函數對象f1,這反過來又返回修改後的新功能。

演示:

def validate_arguments(arg1, arg2): 
    def decorator(func): 
     def wrapped(): 
      print arg1, arg2 
      return func() 
     return wrapped 
    return decorator 

def f1(): 
    return True 
f1 = validate_arguments(1, 2)(f1) 
print f1() 
#1 2 
#True 
+0

輕微相關:如果你要調用一個裝飾而沒在函數傳遞(如裝飾做的工作在全球範圍內):'the_decorator(拉姆達:無)( )' – fgblomqvist