私は、主な設計指針の原則が拡張性であるプロジェクトに取り組んでいます。
クラス メソッドを使用して、読み込まれるプラグインのクラス名を登録するメタクラスを定義することにより、プラグイン システムを実装しました(各タイプのプラグインは、コア コードで定義された特定のクラスから継承します。アプリケーション)。基本的にこれは、開発者が自分のクラスを次のように定義する必要があることを意味します。
class PieChart(ChartPluginAncestor):
# Duck typing:
# Implement compulsory methods for Plugins
# extending Chart functionality
PieChart
で利用可能な登録済みプラグインのリストに含まれるため、メインプログラムは彼の存在を認識しChartPluginAncestor.plugins
ます。
マウント メソッドがクラス メソッドであるため、すべてのプラグインは、クラス コードがメモリに読み込まれるときに登録されます (したがって、そのクラスのオブジェクトがインスタンス化される前であっても)。
システムは私にとっては十分に機能します ™ (ただし、アーキテクチャを改善する方法についての提案はいつでも受け付けています!) しかし、プラグイン ファイルを管理する最善の方法は何か (つまり、プラグインを含むファイルの場所と方法) を考えています。保管する必要があります)。
これまでのところ、開発目的で「プラグイン」と呼ばれるパッケージを使用しています。プラグイン クラスを含むすべての *.py ファイルをパッケージ ディレクトリにimport plugins
置き、すべてのプラグインが適切にマウントされるように、main.py ファイルで発行するだけです。
編集:ジェフは、パッケージのさまざまなモジュールに含まれるクラスがすぐに利用できないことをコメントで指摘しましたimport plugins
(デバッグ目的で、各クラスを個別にインポートしていたため、これに気づきませんでしたfrom plugins.myAI import AI
)。
ただし、このシステムは、次のように、コードを開発およびテストしている間のみ有効です。
- プラグインには独自のユニットテストが付属している場合があり、それらをメモリにロードしたくありません。
- すべてのプラグインは現在メモリにロードされていますが、実際には同じ機能の代替バージョンである特定のプラグインが存在するため、2 つを切り替えることができることを知っておく必要がありますが、選択したものだけをメモリにロードしたい構成ペインから。
- ある時点で、プラグインをインストールするための 2 つの場所が必要になります。システム全体の場所 (たとえば の下のどこか
/usr/local/bin/
) とユーザー固有の場所 (たとえば の下のどこか/home/<user>/.myprogram/
) です。
だから私の質問は本当に - おそらく - 3つです:
- プラグイン コンテナー:私の目標にとって最も賢明な選択は何ですか? 単一のファイル?パッケージ?.py ファイルの単純なディレクトリ?)
- 必ずしもプラグインをロード (インポート) せずにプラグインの存在を認識する: Python イントロスペクションを使用してそうするスマートな方法は何ですか?
- プラグインを2つの異なる場所に配置する:それを行うための標準的な方法/ベストプラクティス(少なくともgnu/linuxの下)はありますか?