Python,以正确的方式进行条件导入

时间:2011-07-22 17:25:40

标签: python import conditional factory-pattern

现在我有一个名为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有一个更简单的解决方案。

4 个答案:

答案 0 :(得分:13)

将你的行放入a_finder.py:

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

然后在您的产品代码中:

from a_finder import A

你会得到合适的A.

答案 1 :(得分: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即可。

答案 2 :(得分:1)

您是否可以在第三个位置创建一个包,检查OldVersion并从正确的位置获取它自己的A,然后始终导入该包?

答案 3 :(得分:-2)

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

类似的东西?

old.someFunc()
new.someFunc()

我没有明白这个问题。