2011-08-06 7 views
0

Pythonデコレータを使用してWebアプリケーションハンドラを単純にしようとしています。Pythonで2つのデコレータを実装するにはどうすれば呼び出し関数を呼び出すことになりますか

デコレータを使用して、認証されたセッションをチェックするコードを抽象化し、キャッシュプロバイダ(この例ではMemcache)が適切なレスポンスを持っているかどうかをチェックするコードを抽象化します。

がデコレータでこのメソッドの定義を検討してください。

@auth.login_required 
@cache.clear 
def post(self, facility_type_id = None): 

は、ユーザがログインしているかどうかを確認するためにチェックをauth.login_required、そうでなければ適切なエラーメッセージを返す、または元の機能を実行します。

cache.clearは、呼び出し元のメソッドを実行する前に、キャッシュに特定のキーがあるかどうかを確認してそのキーを削除します。

auth.login_requiredとcache.clearの両方で、呼び出しメソッド(post)を最終的に実行するとします。

私が両方を読んだことから、私が今やっていることは、呼び出しメソッド(post)を2回実行します。

私の質問は、呼び出し元のメソッドの実行を終了させるデコレータをどのようにしますが、一度しか呼び出されないようにします。

ご指摘いただきありがとうございます。

答えて

4

それぞれの連続したデコレータは、以前にラップされた関数を受け取るので、関数自体はチェーンの終わりに一度だけ呼び出されます。簡単な例を示します:

def dec1(f): 
    def wrapped(): 
     print 'dec1' 
     return f() 
    return wrapped 

def dec2(f): 
    def wrapped(): 
     print 'dec2' 
     return f() 
    return wrapped 

@dec2 
@dec1 
def spam(): print 'spam' 

>>> spam() 
dec2 
dec1 
spam 
1

あなたはデコレータの仕組みを理解していませんでした。

2つのデコレータはすでに「シーケンスされています」。外側のものは、すでに装飾された機能を実行するための関数として受け取ります。内部関数は2回呼び出されることはありません。

関連する問題