Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Pyhonの引数のあるデコレータの解説

【Python入門】引数のあるデコレータについての解説

Python入門者にむけて、引数をもつデコレータの基本的な考え方を解説。

今回のPython文法入門解説は、ただでさえ入門者を困らせるデコレータについて、そのデコレータに引数が設定されている場合の使い方の解説です。

つまり、

@decorator(3,5)
def fnc(a, b):
    ~

となっているようなデコレーターの使い方についての解説です。

前提知識:デコレータとは?

まず今回の解説の前提知識として、デコレーターの基本的考え方が必要です。それについては、当ブログ「【Python入門】デコレータの基本をわかりやすく解説」で解説をしていますので、そちらをご覧ください。

また、デコレータを重ねて使う多重デコレータについても、「Pythonの多重デコレータについての解説。初心者に向けたPython文法入門解説」で解説を書きましたので、そちらをご覧ください。

引数つきデコレータの解説

コード例

考え方

上のコード例のだいたいの処理の流れというか、大まかな考え方を説明すると次のようになります。すなわち、

① デコレータf2はf3を返す。よってf2はf3になる。この時点でデコレータf2は実質f3になる。そのときf3はf2の仮引数の値の情報(3, 5)を引き継いでる。

② f3が実質的なデコレータとなるので、f3の仮引数にはデコレートされるf1が設定される。デコレータの仕様により、一時的に「f1=f3」となる。

③ しかしf3もf4を返すので、f3=f4となり、「f1=f3=f4」。よって「f1=f4」へ。

④ f1(1, 2)は結局、f4(1, 2)となる。f1の実引数(1, 2)という情報と、f2の実引数(3, 5)という情報の両方をもったf4が実行される。

この①の部分ですが、これは結局のところ、

f2という関数は、実質的なデコレータとなるf3を作り出すための関数であることを意味します。

見た目上は、

@f2(3, 5)

と書いているので、f2がデコレータとなっているわけですが、それはあくまで形式的なものであり、実質的なデコレータはf3であって、f2はそのf3を作り出すために形式的に使われているだけ、という感じです。

これについては特に、上コード例の9行目で、

print(fnc)  # result: <function f1 at 0x000002A054B5B3A0>

これによって、fncの中身が実質f1だと示されますので、自動的に引数fncに関数f1が設定されるわけですので、やはりf3が実質的なデコレータだとわかります。

また、13、14行目の

print((first_para, second_para))  # result: (3, 5)
print((args[0], args[1]))  # result: (1, 2)

によって、f4が、f2の引数の情報とf1の引数の情報のどちらも引き継いでいるとわかります。

なお、10行目の

        def f4(*args: tuple) -> int:

における「*args」という引数の表現(記号「*」は、アスタリスク)については、「Pythonの引数*args, **kwargsとは?その解説」で説明してあるので、読んでみてください。

プログラミングを学びIT業界へ転職するなら現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのが良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。

など各種の講座が用意されています。無料で体験できるテックアカデミー無料体験も用意されています。

愛を分かち合いましょう