※当サイトの記事には、広告・プロモーションが含まれます。

PythonのWebフレームワークFastAPIで複数Controllerクラスの設計ってどうするのか

gigazine.net

視覚的に人の注意を引きつける資料は、心理学や神経科学の研究においてよく用いられるそうです。こうした研究において、回転させることで別の絵に見える「だまし絵」が利用できないかと考えたジョンズ・ホプキンズ大学の研究者らが、こうした絵をAIで生成して実験を行いました。

AIで作成した「回転すると別のものに見える絵」が知覚研究に役立つ - GIGAZINE

今回の研究で、ただのだまし絵でも知覚研究には大いに役立つということが分かったため、ボガー氏らはさらなる研究を望んでいます。ボガー氏らは「これらの画像は、大きさ、生命の有無、感情に至るまで、あらゆる種類の効果を研究するために使用することができます。これまで不可能だった方法で、人が絵をどのように認識しているかを研究できるのです。加えて、見ていて楽しいのは言うまでもありません」と述べました。

AIで作成した「回転すると別のものに見える絵」が知覚研究に役立つ - GIGAZINE

⇧ 検証データを「AI」で生成できたという話っぽいのだが、

隠し絵(かくしえ)/ダブルイメージDouble Image)とは、絵の中に、よく注意して見なければわからないように工夫して、他の絵を描き込んであるもの。さがし絵ともいう。有名な絵に『嫁と義母』や『ルビンの壺』がある。

隠し絵 - Wikipedia

⇧ 上記の「隠し絵」にも応用して欲しいところですな。

その前に、研究の領域の分類をしっかりとして欲しいのだが...

PythonのWebフレームワークFastAPIで複数Controllerクラスの設計ってどうするのか

Java」の「Spring framework」とかだと、割かしフレームワーク側で良しなにしてくれるのだが、「Python」の「FastAPI」は利用者側で頑張る必要があるらしく、

stackoverflow.com

⇧ stackoverflowによると、「Controller」クラスを用意するだけでは駄目らしい...

「ChatGPT」氏に質問してみたところ、以下のような回答が返ってきた。

 

3️⃣ 注意点

  • Controllerクラスは 必ず router 属性を持つ こと

  • Controllerクラスのコンストラクタは 引数なし or デフォルト値あり にする

  • Routerの prefixtags はクラス内で設定しておく

💡 まとめ:

  • 手動で app.include_router() を100回書く必要はない

  • ディレクトリスキャン+動的登録」でスッキリ管理可能

  • 将来的にControllerが増減しても main.py は変更不要

Pythonのプロジェクト構成

app/
 ├─ controllers/
 │    ├─ download_controller.py
 │    ├─ user_controller.py
 │    ├─ order_controller.py
 │    └─ ...  # 100個あってもOK
 ├─ services/
 ├─ progress_store.py
 └─ main.py

■app/main.py

# app/main.py
import importlib
import pkgutil
from fastapi import FastAPI

app = FastAPI()

# controllersパッケージを動的にスキャン
import app.controllers as controllers_pkg

for _, module_name, _ in pkgutil.iter_modules(controllers_pkg.__path__):
    module = importlib.import_module(f"app.controllers.{module_name}")
    # module内のクラスを探す
    for attr_name in dir(module):
        attr = getattr(module, attr_name)
        # router属性を持つクラスを自動登録
        if hasattr(attr, "router"):
            controller_instance = attr()
            app.include_router(controller_instance.router)

⇧ というような感じで、「Java」で言うところの「リフレクション(java.lang.reflect)」っぽいことを自前で実装する必要があるっぽい...

とは言え、「Java」で言うところの「リフレクション(java.lang.reflect)」は利用が推奨されないって話をよく聞きますが...

まぁ、「ChatGPT」氏の回答が「幻覚(ハルシネーション)」という可能性もあるので、何とも言えないのだが...

と言うか、ディレクトリ構成に依存してしまっているのよな...

う~む…、「Python」のフレームワークが微妙過ぎるのか、「Python」のフレームワークの中でも「FastAPI」が微妙過ぎるのか分からないが、フレームワーク側のアーキテクチャで頑張って欲しい気はする...

Java」の「Spring framework」と「Spring Boot」で「Spring Web MVC」とか利用していると、このあたりの実装を隠蔽してくれるので、「Controller」クラスのメソッドの「エンドポイント」の設計さえ、適切にしておけば、フレームワーク側で良しなにしてくれるので、「Python」のフレームワークが煩わしく感じてしまうんよね...

まぁ、

Don't repeat yourself(ドント・リピート・ユアセルフ、DRY)は、特にコンピューティングの領域で、重複を防ぐ考え方である。この哲学は、情報の重複は変更の困難さを増大し透明性を減少させ、不一致を生じる可能性につながるため、重複するべきでないことを強調する。

Don't repeat yourself - Wikipedia

DRY は、Andy Hunt と Dave Thomas の著書 The Pragmatic Programmer (邦題:達人プログラマー) において中心となる原則である。 彼らはこの原則を、データベーススキーマテスト計画ビルドシステムや、ドキュメンテーションにいたるまで非常に幅広く適用している

Don't repeat yourself - Wikipedia

Once and Only Once 原則との対比

DRY はアプリケーションに必要な情報(通例は設定情報)に対して言及しているという点で Once and Only Once (OAOO) 原則とは区別される。比較すると OAOO はコードの機能的な振る舞いについて言及しており、構造体オブジェクト指向言語における継承の実現が必要な理由となっている。

Don't repeat yourself - Wikipedia

⇧ 上記にあるように、同じ構造の記述は繰り返したくないですからな...

所謂、

ボイラープレートコード (: boilerplate code、または単にボイラープレート) は、コンピュータプログラミングでは、殆ど、または全く変化することなく、複数の場所で繰り返される定型コードのセクションのこと。冗長な言語を使用する場合、プログラマーはコードを少しだけ書くだけでも多くのコードを作成する必要がある。このような定型コードはボイラープレートと呼ばれる

ボイラープレートコード - Wikipedia

⇧ 上記のような「ボイラープレート」と言っても過言ではないソースコードについては、

  1. フレームワークアーキテクチャ
  2. 統合開発環境IDE:Integrated Development Environment)の機能

のいずれかで隠蔽して、ソースコードの実装者が考慮する必要のないようにして欲しいのよね...

毎度モヤモヤ感が半端ない…

今回はこのへんで。