我正在寫一個裝飾器,並且出於各種令人討厭的原因[0],檢查它正在包裝的函數是單獨定義還是作爲類的一部分來定義(以及哪些類是新類是子類)。Python:裝飾器可以確定一個函數是否正在類中定義?
例如:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
應打印:
<function foo …>: False
<function bar …>: True
另外,請注意:
- 在點裝飾應用的功能將仍然是一個函數,而不是一個未綁定的方法,因此測試實例/未綁定方法(使用
typeof
或inspect
)將不會工作。 - 請只提供該解決這個問題的建議 - 我知道,有很多類似的方法來達到這個目的(例如,使用一個類裝飾),但我想他們在裝飾時有發生,不晚了。
[0]:具體來說,我在寫一個裝飾器,它可以很容易地用nose
進行參數化測試。但是,nose
將而不是在unittest.TestCase
的子類上運行測試生成器,所以我希望我的修飾器能夠確定它是否在TestCase
的子類中使用,並失敗並出現適當的錯誤。顯而易見的解決方案 - 使用isinstance(self, TestCase)
調用包裝的函數之前是不行的,因爲包裝的函數需要是一個發生器,它沒有得到根本執行。
爲了好奇,這裏是結果:http://paste.pocoo.org/show/532430/ – 2012-01-09 20:23:52