7章関数デコレータとクロージャ
何でこの機能に「デコレータ」という名前を付けたんだ、GoF本の名称と一致していないじゃないか、という苦情がこれまでに多数寄せられてきました†1。「装飾する」(decorate)という名前はおそらく、コンパイラが構文木を辿って(関数などに追加の)情報を加えるという動作によるところが大きいでしょう。
——Smith, Jewett, Montanaro & Baxter「PEP 318-Decorators for Functions and Methods」より[07-01]
[†1] 1995年発行の『Design Patterns』の著者が「ギャングオブフォー(GoF)」と呼ばれるため、この書はGoF本と呼ばれています[EN-14][JP-05]。
関数デコレータ(decorator)は、ソースコードの関数に「印」を付けることでその挙動に何らかの拡張を加えるときに使用します。強力な機能なのですが、使いこなすにはクロージャを理解しなければなりません。
Python 3.0から、予約済みのキーワードにnonlocal
が新たに導入されました。クラスを中心に据えたオブジェクト指向の厳格な処方箋に従っているのなら、これは一生使わなくてもPythonプログラマとしての人生を有意義に送ることができるでしょう。しかし、自分の手で関数デコレータを実装したいのなら、クロージャを完璧に理解する必要があり、そうなればnonlocal
の必要性も明らかになります。
どのようにデコレータで使うかとは別にして、クロージャはコールバックを用いた非同期プログラミングを効率的にするものです。また、(合理的な範囲で)関数スタイルでコーディングするときには必須です。
本章の最終的な目標は、最もシンプルな登録デコレータ( ...
Get Fluent Python ―Pythonicな思考とコーディング手法 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.