9章デコレータとクロージャ
この機能をデコレータと名付けることに関して、多くの反対意見がありました。主なものは、GoF本†1での使われ方との間で一貫性がないという批判です。おそらく、デコレータという名前はコンパイラの処理つまり構文木をたどりアノテーションを行うという操作に関連付けられることが多いのでしょう。
—— 『PEP 318——Decorators for Functions and Methods』
[†1] Gang of Fourと呼ばれる4人組によって1995年に出版された『Design Patterns』(Gamma他、Addison-Wesley)の通称です。
関数のデコレータを使うと、関数のふるまいを拡張するための目印のようなものをソースコードに記述できます。とても強力なしくみなのですが、使いこなすにはクロージャへの理解が不可欠です。関数の外側で定義された変数の値を取得する際に、クロージャが必要になります。
Pythonでの予約語の中で最もわかりにくいのが、Python 3.0で導入されたnonlocalです。クラスを中心としたオブジェクト指向の考え方に厳密に従うなら、nonlocalについてまったく知らなくてもPythonプログラマーとして生産的な日々を送れるでしょう。しかし、関数のデコレータを自分で実装したいなら、クロージャを理解しなければなりません。そのときnonlocalの必要性が明らかになるはずです。
クロージャはデコレータ以外でも使われます。コールバック関数を使ったプログラミングではクロージャへの理解は不可欠ですし、関数型プログラミングのスタイルでコーディングしたい場合にも必要になります。
この章の最終的な目標は、関数のデコレータのしくみを正確に説明することです。対象の関数をリストに登録するだけのシンプルなデコレータから、パラメータ化された複雑なデコレータまでを取り上げます。この目標を達成するまでの間に、以下の点についても解説します。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access