回答
在因爲example
裝飾可能不會離開這在運行時檢測到的任何痕跡,不可能在一般的情況下 - 例如,它可能是
def example(f):
return f
如果你控制源代碼爲example
,當然很容易使其標記或記錄正在裝飾的功能;如果你不這樣做,那麼做你想做的事情可能是完全不可能的。
我不認爲有一個通用的方式,因爲裝飾器是一個簡單的函數調用。你的代碼是相同的:
def test1():
print "test1"
test1 = example(test1)
你也許可以通過拆解和分析(使用dis
模塊)檢測特定的裝飾。或者你可以簡單地解析源文件,雖然這有點難看。
爲什麼你想首先檢測它們?
我的腳本用於訪問RESTful界面。我想反思我的模塊,並找到所有的方法「標記」與某個裝飾器,並在運行時建立我的「optparse」選項。由於裝飾器爲我的參數強制執行某些一致性,因此檢查所有REST端點將由它進行裝飾是有意義的。 – TheDude 2010-01-27 02:20:17
如果你可以編輯裝飾模塊中的一些示例代碼和裝飾器的定義,我們可以想出一個方法來做到這一點。 – 2010-01-27 02:31:10
如果我簡單地在「do_」之類的前綴上加上「optparse」可選功能,我實際上可以輕鬆實現我想要的功能。然後我可以遍歷這些函數併爲以「do_」開頭的函數創建一個optparse選項。我只是覺得這將是更清潔的基於我的裝飾檢查。 – TheDude 2010-01-27 03:00:31
如果可以,猴補丁在運行時的裝飾趕上正在被傳遞給它的功能:
decfuncs = []
def decpatch(dec):
def catchdec(func, *args, **kwargs):
decfuncs.append(func)
return dec(func, *args, **kwargs)
return catchdec
somemodule.somedecorator = decpatch(somemodule.somedecorator)
既然你已經表明你有在包裝代碼的控制,這裏有一個例子:
def example(f):
f.wrapped = True
return f
@example
def test1():
print "test1"
def test2():
print "test2"
print test1.wrapped
print hasattr(test2, 'wrapped')
你會發現這個最近的問題提供了3種方式來做到這一點的詳細信息:
Howto get all methods of a python class with given decorator
- 1. 如何找到所有裝飾有特定裝飾的課程?
- 2. Python的裝飾我的功能檢查
- 3. 包裝一個模塊中的所有功能於一身的包裝
- 4. 有功能註釋的裝飾器
- 5. 從模塊執行所有功能
- 6. 裝飾模塊標準
- 7. Spree模塊裝飾器
- 8. 補丁模塊與裝飾
- 9. 裝飾模塊vs functools.wraps
- 10. 蟒蛇:裝飾模塊
- 11. 查找功能定義在具有:塊
- 12. 裝飾兩個功能?
- 13. 裝飾功能轉到
- 14. 級聯功能和裝飾
- 15. 如何裝飾班級中的所有方法?我能裝飾課堂嗎?
- 16. 有沒有辦法讓裝飾者包裝的功能?
- 17. 查找名稱裝飾
- 18. Python的裝飾帶參數取決於裝飾功能
- 19. 裝飾器是不同於裝飾器的功能類嗎?
- 20. 使用python裝飾器來裝飾功能的一部分
- 21. 查找所有和刪除所有功能的Regedit
- 22. 如何查找Perl腳本中使用的所有模塊並安裝它們?
- 23. 裝飾的jQuery的document.ready功能
- 24. 獲取所有裝飾器
- 25. 調試 - 在所有模塊中起作用的功能
- 26. 參數傳遞給裝飾器時調用裝飾功能
- 27. 功能抽象裝飾類,而不是裝飾
- 28. 添加裝飾功能的一類
- 29. 更改裝飾的內部功能
- 30. 傳遞裝飾器的功能
有關更多信息,請參閱http://stackoverflow.com/q/5910703/711085 – ninjagecko 2011-05-06 22:54:46