Python デコレーターはどのくらいの頻度で使用する必要がありますか?
質問
最近、Python デコレーター (および高階関数) を実験し始めました。これは、Django の単体テストをより簡潔にする可能性があると考えたからです。たとえば、次のように書く代わりに:
def visit1():
login()
do_stuff()
logout()
代わりにできるのは
@handle_login
def visit1():
do_stuff()
しかし、いくつか実験した結果、デコレータは私が期待していたほど単純ではないことがわかりました。まず、さまざまな例で見つかったさまざまなデコレータ構文に混乱しましたが、デコレータの動作がまったく異なることを知るまでは、 引数を取る. 。それからメソッドを装飾しようとしましたが、最終的にはそれが機能しないことがわかりました。 デコレータをディスクリプタに変える を追加することで __get__
方法。このプロセス全体を通じて、私は何度か混乱することになりましたが、それでもこの「装飾された」コードのデバッグは通常の Python よりも複雑であることがわかりました。現在、コードにデコレータが本当に必要かどうかを再評価しています。最初の動機は、実際に高階関数を必要とする何かがあったからではなく、入力の手間を少し節約することでした。
そこで私の質問は次のとおりです。デコレータは多量に使用すべきでしょうか、それとも控えめに使用すべきでしょうか?それらの使用を避けることがますます Python 的になるでしょうか?
解決
デコレータは、その場所に罰金であり、絶対に避けなければならない - 適切な場合;-)。私は基本的に "OKそうするとき、のあるの彼らは、適切な"?
の意味としてあなたの質問を見ます一部の周りにいくつかの接頭辞および/または接尾コードを追加しますが、いくつかのクラスのすべてではない方法が良い例です。それはすべてのメソッドだった、すべてのメソッドをラップするのクラスのデコレータが;-)無限@thisonetoo
を繰り返すよりも良いだろう。それはブルームーンに一度だ場合、それはラッパー(デコレータまたはそれ以外)に出てリファクタリングする価値はありません。中盤では、デコレータは確かに非常に適している大きなグランドがあります。
これは、プログラミングの黄金ルールのいずれかに帰着します。あなたはあなたのコードが繰り返しになって見たら、繰り返しをリファクタリングする必要があり - そして、彼らは唯一の1から遠く離れているものの、デコレータは、そのための優れたツールです(補助メソッドや関数、カスタムのメタクラス、発電機や他のイテレータ、コンテキストマネージャ... の多くのの我々は過去数年間ではPythonに追加された機能のは、最高のこのまたは繰り返しの頻繁な形を考慮するようDRY-ヘルパー、簡単かつスムーズな方法を考えることができます!)。
何の繰り返しがありません場合は、、(特に)ので、リファクタリングのための本当の呼び出し、デコレータのための本当の必要はありません - このような場合には、YAGNI(Y'Ain'tゴナそれを必要とする)ことができる切り札DRY; - 。)
他のヒント
アレックスはすでに私が追加することになりますが、理解し、あなたのコードがはるかに容易になり、デコレータで、かなりよくあなたの質問に答えました。 (時々、あなたは一度だけそれをやっている場合でも)。
たとえば、最初に、私はすべての権限について考えずに、私のDjangoのビューを作成します。 、私はそれらを書いて行っていたときに、私が許可されたユーザを必要とするかを確認し、ちょうど彼らのために@login_required置くことができます。
だから、私の後に来て誰もが一目で眺めが認証保護されてものを見ることができます。
そしてもちろん、彼らははるかにDRY、どこでもこれを入れている。
request.user.is_authenticatedいない場合は(): HttpResponseREdiectを返す(..)
デコレータは共通のものを持ち上げる方法です 側面 コードから外れます。
アスペクト指向プログラミング 支持者は、AOP が不可欠かつ中心となる共通の側面が非常に多くあると言うでしょう。実際、このトピックに関する愚かな議論をここで読むことができます。
アスペクト指向プログラミング vs.オブジェクト指向プログラミング
AOP には一般的な使用例がいくつかあります。ここでいくつか読むことができます:
実稼働ソフトウェアで AOP (アスペクト指向プログラミング) を使用していますか?
デコレータが役立つ分野横断的な懸念事項がいくつかあります。
アクセス制御 (「セキュリティ」) 認証、認可、許可、所有権
ロギング (デバッグ支援と監査を含む)
キャッシュ (多くの場合、 メモ化)
一部のエラー処理は一般的な側面であるため、デコレータの実装に適している可能性があります。
本当に横断的で、AOP デコレータに値するデザイン パターンは他にほとんどありません。
、私はそれがデコレータを使用しての追加複雑さを正当化するだろうと思います。
むしろページの多くのウェブサイトのための素敵な(おそらく複雑な)テンプレートを使用してのように、それは本当に時間を節約し、最終的に明瞭さを追加します。