2014-05-21 79 views
0

有沒有一種方法來獲取參數給裝飾器給定函數被包裝?例如,如何獲得裝飾參數?

@job('default') 
def update_index(): 
    call_command("update_index", remove=True) 


func = update_index 
args = ?? # How to use 'func' to get the string 'default' here? 
+0

這似乎並不適用於此。他正在尋找包裝函數的參數,而不是裝飾器的參數。 – jess

回答

4

一般來說,你不能。

job('default')執行第一個;返回的是用作裝飾器;在本質上,Python做:

def update_index(): 
    call_command("update_index", remove=True) 
update_index = job('default')(update_index) 

因此,job('default')可以返回什麼。它可以返回一個什麼都不做的功能,但返回它的說法:

def job(value): 
    return lambda f: f 

此不做任何處理value,返回的「裝飾」是一個空操作,它返回原有功能不變

對於特定修飾器,它可能是他們留下了一個閉包或額外的屬性,我們可以反思。但這真的取決於特定的裝飾者。

+0

我不遵循'job('default')'的返回值是如何進入這裏的......我不想執行裝飾器或'update_index()' – jess

+0

@jess:這就是裝飾器語法*作品*。 '@'後的位是表達式。它被評估。結果是裝飾器可調用,然後調用傳入的函數 - 裝飾,返回值是用於命名函數。 –

+0

@jess:'update_index()'不在這裏執行。但裝飾者*是*,這就是應用裝飾者的意思。 –