私は、ファイル内でユーザーが関数を定義して(Redis DBを処理するために、おそらく問題はありませんが)プロジェクトを作成しています。これらのファイルは、他の同様のファイルがたくさんあるフォルダに保存されます。カスタムRedisコマンドのようなRedisデータベースで動作する関数のライブラリを構築することを考えてみましょう。新しい機能を追加する機能は、homebrew
と似ています。関数を含むファイルのコレクションからPython関数を呼び出す
現在書かれているとおり、スクリプトを使用している人は、実行したい機能の文字列を提供し、スクリプトはそれを見つけて実行します。私は、メインのスクリプトがこのライブラリディレクトリのファイルを歩き回り、各ファイルのすべての機能をメインスクリプトで利用できるようにしたいと思います。
私は関数名の文字列から関数を呼び出す方法を知っています。私が理解できないことは、このディレクトリ内のファイルをどのように歩き、import
の関数を呼び出すか、関数を呼び出して呼び出すことができるようにすることです。
possibles = globals().copy()
possibles.update(locals())
custom_method = possibles.get(command)
if custom_method:
print custom_method(r)
他のいくつかの質問があります。今、私はそれがcommand
は、コマンドラインから渡された関数名の文字列である。このようなコードを使用して、メインスクリプト内で定義された関数で作業している
ここで私の頭の中で、ファイルの同じ名前のクラスにすべてのライブラリメソッドを強制的に強制する必要がありますか?それか、それと似たようなことが、私がやろうとしていることをより簡単にするでしょうか?おそらくimp
モジュールとfind_module
が役に立ちますか?
Twitterのフォロワーは、このソリューションを提案:https://gist.github.com/1853553
"実行したい機能の文字列を提供し、スクリプトはそれを見つけて実行します。"どうして?文字列表現に頼らずに関数をインポートして名前を付けるのはなぜですか? 'from library.filename import function'を実行し、関数を使用します。なぜ文字列バージョンの関数名が混乱するのでしょうか? –
@ S.Lottこれは、ユーザが次のようなコマンドラインアプリケーションであるためです: '> mytool custom_command「カスタム引数」 そして、その' custom_command'ビットは、私が見つけなければならない関数の名前です実行します。 – aezell
Pythonの '' >>> 'プロンプトからこれをやってみませんか?デフォルトのインポートを保証することができます(http://docs.python.org/library/site.htmlのカスタマイズフックを使用)。それから、単純に、オーバーヘッドや余分な処理なしで 'mytool(custom_command(カスタム引数)) 'とタイプすることができます。 –