Pythonのデコレータの最もシンプルな例(Progate修了レベル)2018-05-28Pythonのデコレータの最もシンプルな例(Progate修了レベル)PythonProgateでPythonのレッスンを修了したばかりのあなたへ。「Pythonマスターしたぜ!」の気分になってDjangoやらFlaskやら実践編をぐぐってみたところわけのわからない「@(アットマーク)」記法にめまいがしている頃かと存じます。心配無用、私のことです。この記事で10分で@をマスターしましょう。引数にとった関数の引数を使いたい上のサンプルコードの解説さて、デコレータを使おうfunc1の引数(wrapperを使う)wrapperが要らない場合まとめ余談:Flaskでよくみる@app.route('/')@記法の正体デコレータというらしいです。Pythonはオブジェクト指向の言語(RubyやSwiftなどもそう)なので、関数もオブジェクトです。関数がオブジェクトであるとはつまりこんなこともできるということです。関数の引数に別の関数を使うこともできます。world引数にとった関数の引数を使いたいデコレータとは、「関数を引数にとって、新しい関数を返す」関数と考えてもらってOKです。▷厳密にいうと関数ではなく「callable」というらしいですが、まあ関数と思っていていいでしょう。ちなみに関数はcallableの一種だそう。いう例を考えましょう。関数Aの中で使いたいですね。こんな書き方はシンタックスエラーになります。syntax困りましたね。これを解決するには、こんな書き方をしなければなりません。Helloちょっとごちゃついてしまいましたが、みてほしいのはfunc2の引数である'Hello'をfunc1の中で自由に使っている点です。world')この段階ではfunc2に引数は入れません。(引数をいれた関数=実行結果です。ここでは関数そのものを渡すので、引数は入れない。)▷sum([1,2])は数値3であって関数sumではないですね。すると、これはすなわち関数innerfuncを返します。したら、返された関数innerfuncに引数をわたせばよいのです。innerfunc('Hello')そうしたら、あとはfunc1の中のinnerfuncに引数'Hello'を入れた結果が出力されます。デコレータを使おうデコレータは、上のコードがあんまりごちゃごちゃしているので簡単にまとめてしまおうというものです。さっきのコードをデコレータを使って書くとこうなります。※「wrapper」というのが増えてしまっていますが、これはあとで説明します。world')ということです。一般化して書くとこうなります。#を表すfunc1の引数(wrapperを使う)func1(関数A)にfunc2(関数B)以外の引数を入れる場合(上のケースがそうでしたね)は、func1(func,arg):のような形のままデコレータを使うとシンタックスエラーになってしまいます。いうときはwrapperを使います(別に名前はなんでもいいです)。書き方は上のケースを参考にしてください。func1自体の引数には関数は入れません。関数を引数にとる関数を内部で新たに定義し、ワンクッション置く形になります。wrapperが要らない場合func1(関数A)の引数にfunc2(関数B)しか入れない場合はこの書き方は不要です。その場合はこんな風に書けばOKです。Helloデコレータを使わずに書くとこうなります。)まとめデコレータがわからないと、フレームワークはすべて呪文になってしまいます。Railsを避けてPythonを選んでるんでしょ?(僕のことです)ちなみにデコレータは複数つけられます。textご質問などあれば気軽にコメントにどうぞ!余談:Flaskでよくみる@app.route('/')Flaskのルーティングで@app.route('/')みたいのがよくでてきますね。意味を知らなくても使えるしすごい楽なんだけど、これもデコレータですね。そもそもappについては上の方でこういうコードで作ってると思います。flask.Flask(__name__)__name__はProgateでも習った__init__と形が似てますね。いう人間が作りそうにない形のものはだいたいシステムで決まったものですよね。__name__にはモジュールの名前が自動的に代入されています。Flask(__name__)つまり引数に__name__をとるFlaskクラスのインスタンスがappです。**options)が定義されているので、このruleに引数としてパス(URL)を渡すわけですね。このへんの中身を全部把握しようとすると骨が折れるので不要と思います。ここはこんな理解でOKです↓。パスごとの処理__name__について詳しくはこちらがわかりやすかったです。noshift.workというサイトを運営しています。このブログではサイト運営のこととか技術的なことを書こうかなと思っています。Beatlesが好きな人は今度カラオケオールしましょう。当サイトをご利用いただくにあたって、訪問者の方は以下のプライバシーポリシーに同意したものとみなさせていただきます(同意頂けない場合は当サイトをご利用いただけません)。非個人情報の収集について当サイトではサイト内容の改善のため、Google社によるアクセス解析ツール「Googleアナリティクス」を利用しています。アドレスやこれまでアクセスしたウェブサイト、デバイス特有の情報、ロケーション情報、および本サービスに関連して訪問者のデバイスに保存され、当該デバイスにおいてアクセスされ、当該デバイスから収集されるその他の情報(場合により、Cookie管理に関する訪問者のオプションに関する情報を含みます)など特定の情報がお使いのウェブブラウザからGoogle社に自動的に送信されます。これらは匿名の情報として送信され、訪問者の個人を特定するようなものではありません。収集された情報は、サイト内容の改善や利用状況の把握の目的で統計的に利用いたします。このデータの収集にはCookieが使用されており、Google社がお使いのブラウザからCookieを読み取るほか、Cookieを設定することもあります。Cookieを無効にすることでトラフィックデータの収集を拒否することが出来ます。お使いのブラウザから設定してください。Analytics利用規約https://www.google.com/analytics/terms/jp.htmlGoogle社プライバシーポリシーhttp://www.google.co.jp/intl/ja/policies/privacy/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。