Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回はPythonの文法の中でもわかりにくいと思われるデコレータのちょっとした解説です。ここで「ちょっとした」と書いたのは、デコレータについてはすでに以下の記事で基本的な使い方を解説したことがあるからです。
以上のようにデコレータについては、
と2通りの使い方があるため最初は混乱しがちです。
そこで今回の記事では引数なしデコレータと引数ありデコレータの決定的な違いについて簡単にまとめておこうと思います。(何が決定的な違いかは人によって解釈や考え方が違うでしょうが、あくまで私の場合はこの記事でいう違いが一番大事だと考えています)
デコレータに引数がついている場合とそうでない場合の決定的な違いとは、デコレータとして定義された関数そのものの引数にどんな情報が入っているか、です。この表のようになります。
デコレータの使い方 | 第1引数に代入されるデータ |
---|---|
引数なし | デコレイトされる関数そのもの |
引数あり | デコレータについた引数 |
以上のことをふまえて下のコード例を見てください。
# 引数なしの基本 ###############################
def f0_to_f2(fnc):
def f2(*arg2):
return fnc(arg2[0]+2, arg2[1]*3)
return f2
@f0_to_f2
def f0(*arg):
print(arg)
f0(2,10)
実行結果は、
(4, 30)
# 引数ありの基本 ###############################
def f1_to_f2(x):
print(x) # -> 3
def f2(fnc):
print(fnc) # -> f1
def f3(a3):
print(a3) # ->2
z = fnc(a3)*2 # 4になる
return z
return f3
return f2
@f1_to_f2(3)
def f1(a):
return a
f1(2)
実行結果は、
2
4
これらの動作の違いを対比させたのが下図です。
両者の決定的な違いは上述のように、デコレータとして定義した関数の最初の引数に何が入るのかということでした。同時に、引数ありデコレータのコードのほうは、関数f2の引数fncにデコレイトされた関数そのものが入るという仕組みになっています。
以上のような違いだけでも覚えておくと、「あれ?引数をつけたデコレータの使い方はどうだったかな?」となったときに混乱しにくくなると思います。以下の記事ではPythonをすぐにマスターできる動画講座を紹介しています。社会人など多忙な毎日に効率的に学習するにはやはり動画学習がベストだと思います。
世界最大の動画学習サイトUdemyで、プログラミングを最速でマスターしましょう。