ftnext / PyConTalkSummary

PyConで聞いたトークのサマリーをIssueに蓄積(arXivTimesリスペクト)
0 stars 0 forks source link

[PyCon JP 2020] 詳解デコレータ #41

Open ftnext opened 3 years ago

ftnext commented 3 years ago

一言でいうと

デコレータの挙動について解説。 引数を取ったデコレータの動きがつかめる

発表資料リンク

https://pycon.jp/2020/timetable/?id=203944

発表者/所属

Nakabayashi さん

発表日付

2021/08/29

概要

シンプルなデコレータ

関数funcはデコレータを付けて定義した

func.__name__ デコレータの中の関数 (wrapper) が返る! @を使わない func = mydeco(func) でも同じ(デコレータの中の関数が返る)

デコレータの中の関数に置き換わっている! funcの実行はwrapperの実行と同じ

デコレータが引数を取る場合

クロージャから始める

関数の外側で定義した変数countを関数の内側で参照し保持している

def counter():
  count = 0
  def _increment():
    nonlocal count
    count += 1
    return count
  return _increment

countを外から渡す=デコレータの引数

実用例

Flaskのルーティング 2重のデコレータ→内側が先

@entry.route("")  # <int:id> -> 関数の引数id
@login_required
def new_entry():
  return render_template("...")

[以下はオプション]

新規性・差分

トークで知って試したいこと

functools.wraps https://docs.python.org/ja/3/library/functools.html#functools.wraps docstringが失われない

感想

値を取るデコレータ、hogeはfuncという名前がよりわかりやすそう

LeuvenさんのUS PyConトーク 2019 👀