Python 2.7 モジュールの形で非常に基本的なプラットフォームを構築しています。このモジュールには、入力されたユーザー コマンドが関数呼び出しにマップされる read-eval-print ループがあります。私は自分のプラットフォーム用のプラグイン モジュールを簡単にビルドできるようにしようとしているので、関数呼び出しはメイン モジュールから任意のプラグイン モジュールになります。プラグインビルダーが自分の関数をトリガーしたいコマンドを指定できるようにしたいので、メインモジュールの command->function dict にマッピングをリモートで入力する Pythonic の方法を探していました。プラグイン モジュール。
私はいくつかのことを見てきました:
メソッド名の解析: Main モジュールはプラグイン モジュールをインポートし、特定の形式に一致するメソッド名をスキャンします。たとえば、download_file_command(file) メソッドを "download file" -> download_file_command として dict に追加する場合があります。ただし、簡潔で入力しやすいコマンド名 (「dl」など) を取得するには、関数の名前も短くする必要があり、コードの可読性には適していません。また、プラグイン開発者は正確な命名形式に準拠する必要があります。
クロスモジュール デコレータ:デコレータを使用すると、プラグイン開発者は自分の関数に好きな名前を付けて、@Main.register("dl") のようなものを追加できますが、別のモジュールの名前空間を変更し、グローバルな状態を維持する必要があります。メインモジュール。これは非常に悪いことだと理解しています。
同じモジュール デコレーター:上記と同じロジックを使用して、関数の名前をコマンド名に追加するデコレーターを追加できます->プラグイン モジュールにローカルな関数マッピングを行い、API 呼び出しでメイン モジュールへのマッピングを取得します。ただし、これには特定のメソッドが常に存在または継承されている必要があり、デコレータに関する私の理解が正しければ、関数は最初に実行されたときにのみ登録され、その後は不必要に再登録されます。
したがって、私が本当に必要としているのは、関数をトリガーするコマンド名で関数に注釈を付けるPythonicの方法であり、その方法は関数の名前にはなりません。モジュールをインポートするときにコマンド名 -> 関数のマッピングを抽出できるようにする必要があり、プラグイン開発者側の作業が少しでも減れば、大きなプラスになります。
助けてくれてありがとう。Python の理解に不備があればお詫びします。私はその言語に比較的慣れていません。