私は非常に基本的なプラットフォームをPython 2.7モジュールの形で構築しています。このモジュールには、入力されたユーザーコマンドが関数呼び出しにマップされるread-eval-printループがあります。プラットフォームのプラグインモジュールを簡単に構築しようとしているので、メインモジュールから任意のプラグインモジュールへの関数呼び出しが行われます。私はプラグインビルダーが彼の機能をトリガーしたいコマンドを指定できるようにしたいので、メインモジュールのコマンド - >関数dictにリモートからマッピングを入力するPythonの方法を探していました。プラグインモジュール。コンパイル時に関数メタデータを提供する最もPythonの方法は?
私はいくつかのことを見てきました:
メソッド名の解析:メインモジュールは、プラグインモジュール をインポートして、特定のフォーマットに一致するメソッド名のためにそれをスキャンします。 の例では、download_file_command(file)メソッドを dictに "download file" - > download_file_commandというように追加することがあります。しかし、 の簡潔で使いやすいコマンド名(「dl」など)を取得するには、 関数の名前も短くする必要があります。これはコード の読みやすさには適していません。また、プラグイン開発者は、正確な命名形式 に従う必要があります。
クロスモジュールのデコレータ:デコレータは、彼が望んでいるものは何でも彼の機能に名前を付ける プラグイン開発者を聞かせて、単に @ Main.register(「DL」)のようなものを追加し、彼らは必ずしも は私の両方のことを必要とするであろうう別のモジュールのネームスペースを変更して、メインモジュールにグローバル状態の を保持します。私はこれがとても悪いことを理解しています。
同じモジュールのデコレータ:上記と同じロジックを使用して、私はいくつかのコマンド名 - > プラグインモジュールにローカルな関数マッピングに関数の名前を追加します デコレータを追加し、へのマッピングを取得することができメインモジュールには API呼び出しがあります。これは、特定のメソッドが常に存在するか、または が継承されていることを必要とします。デコレータの理解が正しい場合、その関数は最初に実行されるときに登録され、その後は毎回 を毎回再登録します。
このように、私が本当に必要なのは、それをトリガーするコマンド名と機能に注釈を付けるためのPython的な方法があり、その方法は、関数の名前にすることはできません。モジュールをインポートするときにコマンド名 - >関数マッピングを抽出できるようにする必要があります。プラグインの開発者側の作業はそれほど大きくはありません。
私のPythonの理解に何らかの欠陥がある場合は、助けてくれてありがとう、謝罪します。私はその言語には比較的新しいです。
- 出会うプラグイン
- トリガープラグイン
あなたの質問アドレスのみ第二部では、提案ソリューションのいくつかのコード実行:
はちょうどあなたがこれを実現チェックが、デコレータ(および機能の定義)は、実行時に実行するには、Pythonはコンパイル時にない唯一のものは、あなたのコードをコンパイルしています。 – Duncan
方法2で何も間違っていません。 'import plugin'のようなことをして、' @ plugin.register( 'my_method_name')\ ndef somefunc_meeting_an_api_spec():... ' –
[plac](http://pypi.python.org/pypi/plac)はそれを行います。 – georg