Address
304 North Cardinal St.
Dorchester Center, MA 02124

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

Python デコレータ

Pythonの引数ありデコレータと引数なしデコレータの決定的な違い

Pythonの引数ありデコレータと引数なしデコレータの決定的な違い

今回はPythonの文法の中でもわかりにくいと思われるデコレータのちょっとした解説です。ここで「ちょっとした」と書いたのは、デコレータについてはすでに以下の記事で基本的な使い方を解説したことがあるからです。

以上のようにデコレータについては、

  • 「@decorator」のように引数なしで使う場合
  • 「@decorator(x, y)」のように引数ありで使う場合

と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

これらの動作の違いを対比させたのが下図です。

Pythonのデコレータとその引数

両者の決定的な違いは上述のように、デコレータとして定義した関数の最初の引数に何が入るのかということでした。同時に、引数ありデコレータのコードのほうは、関数f2の引数fncにデコレイトされた関数そのものが入るという仕組みになっています。

以上のような違いだけでも覚えておくと、「あれ?引数をつけたデコレータの使い方はどうだったかな?」となったときに混乱しにくくなると思います。以下の記事ではPythonをすぐにマスターできる動画講座を紹介しています。社会人など多忙な毎日に効率的に学習するにはやはり動画学習がベストだと思います。

世界最大の動画学習サイトUdemyで、プログラミングを最速でマスターしましょう。

Udemy
愛を分かち合いましょう