私は、Pythonの関数とメソッドの両方で使用できるデコレータを作成しようとしています。これはそれ自身では難しいことではありませんが、引数を取るデコレータを作成するときは、そうであるようです。関数とメソッドで同じデコレータ(引数付き)を使用する
class methods(object):
def __init__(self, *_methods):
self.methods = _methods
def __call__(self, func):
def inner(request, *args, **kwargs):
print request
return func(request, *args, **kwargs)
return inner
def __get__(self, obj, type=None):
if obj is None:
return self
new_func = self.func.__get__(obj, type)
return self.__class__(new_func)
上記のコードが正しく関数/メソッドをラップするが、この方法の場合には、request
引数は、上で動作している場合ではなく、最初の非自己引数です。
デコレータがメソッドではなく関数に適用されているかどうかを判断する方法はありますか?
'_MethodDecoratorAdaptor .__ init__'の*先頭に' update_wrapper(self、func) 'を追加するべきです(ここで、update_wrapperはfunからですctoolsモジュール)。これにより、結果として得られるデコレータは、デコレータが作成した関数/呼び出し可能関数のカスタム属性を保持しながら、それらを合成可能に保ちます。 – spookylukey
私は、この方法がいくつかの状況でのみ機能し、うまく動作しないときにデバッグするのが非常に難しいことを発見しました。 http://groups.google.com/group/django-developers/msg/f36976f5cfbcbeb3 – spookylukey
@spookylukey実際にはこれがDjangoで処理される方法はかなりきれいです。 – astrojuanlu