回目の呼び出しではキャッシュされた値が返っていることが分かる。デコレータが機能しているようだ。デコレータの本質おさらいが終わったところで、早速本題に入る。シンタックスシュガーというのは、プログラミング言語において、ある書き方に対して別の書き方ができるようにしたもの。デコレータがシンタックスシュガーということは、つまり同じ内容はデコレータを使わなくても書けるということ。先ほどのサンプルコードを、デコレータを使わない形に直してみよう。main()上記を保存して実行してみよう。cache.pycalculate33ちゃんとメモ化が動作していることが分かる。デコレータとして使っていない。代わりに、次のようなコードが登場している。関数を代入し直している。返り値で上書きされることになる。lru_cache()(add)つまり、最初のコードで登場した以下と上記は本質的に等価ということ。b):これは理解する上で重要なポイントで、デコレータを使って書かれたコードは、必ず使わずに書くこともできる。続いてはデコレータの作り方を見ていく。前述したように、デコレータは単なるシンタックスシュガーで、やっていることは単なる返り値を使った上書きだった。それさえ分かっていればデコレータの作り方は理解しやすい。関数をデコレートするデコレータについて考えてみよう。これまで理解した内容から考えれば「関数を受け取って、代わりとなる関数を返す」ものを作れば良い。いう名前でデコレータを作っている。見て分かる通り、普通の関数と見た目は何ら変わらない。デコレータとして動作する関数、ということになる。いう関数の参照を返している。main()このデコレータは、本来の関数の呼び出しの前後に文字列の出力を挟み込むものになっている。いう関数で、内容は文字列を出力するだけ。上記を保存して実行してみよう。追加した処理が挟み込まれていることが分かる。World!after念のため、デコレータを使わないパターンも見ておこう。繰り返しになるけど、デコレータはただのシンタックスシュガーなので、必ず使わない形にも直せる。デコレータを使わない形にすれば、やっていることがよく分かる。関数の参照を返しているだけ。上記を保存して実行してみよう。World!afterちゃんと動作している。デコレータと違うところが一つあった。それは、デコレータとして使うとき後ろにカッコがあるかないか。例を思い出すと、後ろにカッコがついていた。例では、後ろにカッコがない。greet():上記の違いは、デコレータが引数を受け取るか受け取らないか。いうオプションがあったりするため。引数を受け取れるように書き換えてみよう。デコレータが本来の処理の前後に挿入するメッセージを引数で指定できるようにしている。ネストが増していることが分かる。main()上記を保存して実行してみよう。今度はデコレータを使うときに指定した引数にもとづいて前後の出力が変化している。World!ato引数を取るパターンでは、取らないパターンよりも何をやっているのかが分かりにくいかもしれない。これも、デコレータを使わない形に書き直すと理解しやすくなる。以下のサンプルコードは、同じ内容をデコレータを使わない形に直してある。main()上記を見ると、関数を上書きする工程が二段階に分かれていることが見て取れる。