2011-07-22 4 views
7

は今、私はA.パイソン、条件付き輸入私はこのようないくつかのコードを持っている

と呼ばれるクラスを持って正しい方法をやって..

from my.package.location.A import A 

... 


foo = A.doSomething(bar) 

は、これは素晴らしいです。

しかし、私はAと呼ばれる新しいバージョンのAを持っていますが、別のパッケージになっていますが、特定のシナリオでこの他のAを使用したいだけです。だから私はこのような何かをすることができます:

if(OldVersion): 
    from my.package.location.A import A 
else: 
    from new.package.location.A import A 

... 

foo = A.doSomething(bar) 

これはうまくいきます。しかし、それは醜いです。私はこれをより良くするにはどうすればいいですか?私は本当にこのようなことをしたいです

from my.abstraction.layer.AFactory import AFactory 
... 
myA = AFactory.giveMeA() # this looks at "OldVersion" and gives me the correct A 
foo = myA.doSomething(bar) 

私はそれを簡単にする方法はありますか?ファクトリーレイヤーがなければ?これで、クラスのすべての静的メソッド呼び出しを2行にすることができます。私はいつも影響を減らすためにクラス内の参照を保持することができますが、実際にはPythonがもっと簡単な解決法を望むことを本当に望んでいます。

答えて

13

はa_finder.pyにあなたのラインを入れ

from a_finder import A 

、あなたは私はあなたがあなたの答えを撤回することができると思い

+0

これはPythonがちょうど "うまくいく"方法です –

1

OldVersionをチェックして正しい場所から自分のAを取得した後、常にそのパッケージをインポートすることができますか?

-2
from my.package.location.A import A as old 
from new.package.location.A import A as new 

そのようなものはありますか?

old.someFunc() 
new.someFunc() 

私は質問のポイントを得ていません。

+0

適切A.を取得しますあなたがポイントを取得していない場合... – sage

+0

@sage Lol。 4年前、私は担当者のせいでコメントできませんでした。だから私は詳細な情報を得るための答えとして投稿します。 – Jaxedin

2

あなたはこのような何か行うことができます:

AlwaysRightA.pyその後

import sys 
if(OldVersion): 
    from my.package.location.A import A 
else: 
    from new.package.location.A import A 
sys.modules[__name__] = A 

単にimport AlwaysRightA as Aを、あなたが設定されています。お使いの製品コードで次に

if OldVersion: 
    from my.package.location.A import A 
else: 
    from new.package.location.A import A