python3の デコレータ
でハマった.
@なんちゃら
の意味が分からん.
コードを書きながら理解する.
概要は次の通り.
動作環境
- Python 3.6.5
今回のゴール
今回のゴールは次の通り.
- デコレータ について知る
- 次のコード
@hoge
の役割がわかる - ちょっと動かしてみる
@hoge
def hogehoge():
return 'xxx'
結論
- デコレータはPythonで使われる syntactic sugar だ.
事前知識
デコレータを理解するには事前知識が必要.
- syntactic sugar
- デコレータ
*args
の使い方- 関数の特徴
簡単に解説.
syntactic sugar
syntactic sugar の意味をググった.
糖衣構文(とういこうぶん、英: syntactic sugar)は、プログラミング言語において、読み書きのしやすさのために導入される書き方であり、複雑でわかりにくい書き方と全く同じ意味になるものを、よりシンプルでわかりやすい書き方で書くことができるもののことである。構文上の書換えとして定義できるものであるとも言える
引用: 糖衣構文 | wikipedia
つまりこういうこと.
- 動作は一緒だけど
- 本来の書き方よりももっと簡単な表現
デコレータ
デコレータを簡単にまとめるとこんな感じ.
@
を使った記法- 既存関数を直接変更することなく, 機能追加or変更が可能
- 基本構文
@デコレータ名
pythonには組込のデコレータがあって,
有名なのはこのへん↓
@classmethod
今回は使わないけど覚えておく.
*args
の使い方
関数 (dev
) の基本.
*args
は引数をいくつとるか分からないときに便利.
たとえばこんな感じ↓
# smpl.py
def printArgs(*args):
print('引数はこれ = ', args)
printArgs('a', 'b', 'c')
実行
$ python smpl.py
引数はこれ = ('a', 'b', 'c')
関数の特徴
python の関数には次の特徴がある.
- 引数に 関数 を渡せる
- 返り値として 関数 を返せる
デコレータを理解するには↑これを意識するのが大切.
事前知識はこれでok.
コードを書いて理解する
実際にコードを書きながら理解する.
まず, 次の2つの動作は一緒.
def sayHi():
return 'hi'
sayHi = hoge(sayHi)
↑これが ↓こう 書ける
@hoge
def sayHi():
return 'hi'
↑これが syntactic sugar.
@
を使った方が簡単でしょ?
ということらしい.
コードが短いと @
の有り難みがわからん.
これの仕組みを理解するには,
さっきの関数の特徴を思い出すと良い.
つまりこういうこと↓
じゃあごにょごにょしてみるか.
ここでのゴールは次の通り.
hoge()
で- ごにょごにょを定義して
- その結果を関数としてreturn
いざ、実践.
# smpl.py
def hoge(attrFunc):
# ここでごにょごにょを定義
def gonyoGonyo(*args):
print('ごにょごにょしたよ')
return attrFunc(*args)
return gonyoGonyo
@hoge
def sayHi():
return 'hi'
# 実行
result = sayHi()
print(result)
実行結果
$ python smpl.py
ごにょごにょしたよ
hi
*args
は引数を利用した処理をしたいときに効果を発揮する.
今回は利用しなかった.
このコードの何が凄いのか.
それはここ↓
@hoge
def sayHi():
return 'hi'
def で定義した箇所は一切触ってないのに,
@hoge
を付けただけで動作が変わった!!!!
きっとこれがデコレータの威力.
pythonにおけるデコレータの基本はこんな感じ.
今回は以上.