私はデコレータを書いていますが、さまざまな厄介な理由[0]で、ラップしている関数がスタンドアロンで定義されているのか、クラスの一部として定義されているのか(さらに、新しいクラスがサブクラス化されているクラス)を確認すると便利です。 。
例えば:
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)
ラップされた関数を呼び出す前に使用することは機能しません。ラップされた関数はジェネレーターである必要があり、まったく実行されないためです。