Python, правильно выполняющий условный импорт - PullRequest
7 голосов
/ 22 июля 2011

Прямо сейчас у меня есть класс с именем 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 ]

13 голосов
/ 22 июля 2011

Поместите ваши строки в 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.

2 голосов
/ 22 июля 2011

Вы можете сделать что-то вроде этого:

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 и все готово.

1 голос
/ 22 июля 2011

Не могли бы вы просто сделать пакет в каком-то третьем месте, который проверяет OldVersion и получает свой собственный A из нужного места, а затем всегда импортирует этот пакет?

0 голосов
/ 22 июля 2011
from my.package.location.A import A as old
from new.package.location.A import A as new 

что-то в этом роде?

old.someFunc()
new.someFunc()

Я не понял сути вопроса.

...