2010-01-27 51 views

回答

9

在因爲example裝飾可能不會離開這在運行時檢測到的任何痕跡,不可能在一般的情況下 - 例如,它可能

def example(f): 
    return f 

如果你控制源代碼爲example,當然很容易使其標記或記錄正在裝飾的功能;如果你不這樣做,那麼做你想做的事情可能是完全不可能的。

+0

有關更多信息,請參閱http://stackoverflow.com/q/5910703/711085 – ninjagecko 2011-05-06 22:54:46

3

我不認爲有一個通用的方式,因爲裝飾器是一個簡單的函數調用。你的代碼是相同的:

def test1(): 
    print "test1" 

test1 = example(test1) 

你也許可以通過拆解和分析(使用dis模塊)檢測特定的裝飾。或者你可以簡單地解析源文件,雖然這有點難看。

爲什麼你想首先檢測它們?

+0

我的腳本用於訪問RESTful界面。我想反思我的模塊,並找到所有的方法「標記」與某個裝飾器,並在運行時建立我的「optparse」選項。由於裝飾器爲我的參數強制執行某些一致性,因此檢查所有REST端點將由它進行裝飾是有意義的。 – TheDude 2010-01-27 02:20:17

+1

如果你可以編輯裝飾模塊中的一些示例代碼和裝飾器的定義,我們可以想出一個方法來做到這一點。 – 2010-01-27 02:31:10

+0

如果我簡單地在「do_」之類的前綴上加上「optparse」可選功能,我實際上可以輕鬆實現我想要的功能。然後我可以遍歷這些函數併爲以「do_」開頭的函數創建一個optparse選項。我只是覺得這將是更清潔的基於我的裝飾檢查。 – TheDude 2010-01-27 03:00:31

-1

如果可以,猴補丁在運行時的裝飾趕上正在被傳遞給它的功能:

decfuncs = [] 

def decpatch(dec): 
    def catchdec(func, *args, **kwargs): 
    decfuncs.append(func) 
    return dec(func, *args, **kwargs) 
    return catchdec 

somemodule.somedecorator = decpatch(somemodule.somedecorator) 
8

既然你已經表明你有在包裝代碼的控制,這裏有一個例子:

def example(f): 
    f.wrapped = True 
    return f 

@example 
def test1(): 
    print "test1" 

def test2(): 
    print "test2" 


print test1.wrapped 
print hasattr(test2, 'wrapped')