1

インポートする必要がある可能性のあるファイルの長いリストがあります。私はそれらのうちの1つだけを必要とし、それらはすべて同じインターフェースを持っています. (支払いを処理する支払いゲートウェイの選択)

すべてのゲートウェイ ファイルの名前を表す辞書があるとします。

すなわち

gateways = {
   '1' : 'authorize',
   '2' : 'paysimple',
   '3' : 'braintreepayments',
   '4' : 'etc',
}

データベースからの情報に基づいて、この辞書のキーを知っています。したがって、ゲートウェイ値が 1 の支払いプロセス要求を受信した場合、Authorize.net で処理する必要があることがわかります。A 2 は Pay Simple で処理されます。等。

恐ろしいステートメントのリストではなく、私が知っている情報で構築されたインポートステートメントを作成できるようにしたいと考えていますelif

以下の簡単な方法を検討してください。

# For the purposes of this example assume payment_gateway is defined
# elsewhere and represents the key to the dictionary
gateway_file = gateways.get(payment_gateway)

import_str = "from gateway_interface.%s import process" % gateway_file
gogo(import_str)

gogoimport ステートメントを実際にインポートさせる方法はどこにありますか。

そのようなことは可能ですか?

4

3 に答える 3

5

最も単純な

process = __import__('gateway_interface.'+gateway_file,fromlist=['foo']).process

編集: fromlist の 'foo' は、fromlist が空のリストでない限り、何でもかまいません。その少しの奇妙さは、Python の __import__ が fromlist を必要とするのはなぜですか?で説明されています。.

Python の __import__ does not work as expected__import__で詳しく説明されているように、最初の投稿では期待どおりに機能しなかったため、編集する必要もありました 。

あなたがpython 2.7を持っているなら

import importlib
process = importlib.import_module('gateway_interface.'+gateway_file).process

WAAAAYクールはpackage_toolsを使用することです(例from pkg_resources import iter_entry_points

これにより、gateway_interface の下にない奇妙なパッケージにある場合でも、適切な関数を見つけるソリューションが得られる可能性があります。それらがすべて1か所にあり、過剰なスタイルポイントが必要ない場合...ええ、ただ__import__

于 2012-07-10T00:34:11.340 に答える
2

importステートメントの内部またはメソッド自体にアクセスできるようにするimpモジュールを見てください__import__-これらのいずれかで、あなたが説明したことを達成できるはずです。

于 2012-07-09T23:23:03.603 に答える
1

組み込み__import__メソッドが機能するはずです:

process = __import__(gateways.get(payment_gateway)).process
于 2012-07-10T00:25:26.193 に答える