「@(デコレータ)」とは一言でいうと「関数をラップして、機能を付け足す仕組み」です。(Pythonが標準で持っている機能(文法)です。)その名の通り「既存の関数を飾り付け(デコレーション)して、新しい機能を付け足すためのPythonの構文」です。元の関数のコードを書き換えることなく、その前後に処理を挟み込んだり、システムに登録したりすることができます。
使い方はJava Spring Frameworkのアノテーションとそっくりですね。ただデコレータは自分で実装できるところが大きく異なります。そのおかげで、デコレータの内部構造も理解できます。さらには、アノテーションは実質Springにおける機能と言えますが、デコレータは「Python標準」だから、FastAPIでもFlaskでもdjangoでも共通です。
FastAPIの「@app.get(“/”)」が実際にやっていること
例えば以下コードにあるこの部分
@app.get("/", response_class=HTMLResponse)
def index_page(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
これは、デコレータを使わずに書くと、実は裏側でこういう関数呼び出しが行われています。
# 1. 普通の関数を定義する
def index_page(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
# 2. FastAPIシステム(app)に、この関数を登録する
app.get("/", response_class=HTMLResponse)(index_page) # ←これ
たしかにデコレータを使うことで、「この関数が、どのURL(パス)を担当しているのか」が視覚的に真上にくっついて見えるため、コードの可読性があがりますよね。
bashの「既存コマンドを関数でラッピング」する考えに似てます

関数ラッピング
bashコマンドには優先順位があり最も関数が優先されます。関数→組込みコマンド(builtin)→alias→外部コマンド(path登録したスクリプト)この特徴を生かし以下のような事ができます。危険なコマンド実行前に確認を入れるrm() {…
