Python, haciendo importaciones condicionales de la manera correcta.

Ahora mismo tengo una clase llamada A.

Tengo un código como este ..

from my.package.location.A import A ... foo = A.doSomething(bar) 

Esto es genial.

Pero ahora tengo una nueva versión de A llamada A, pero en un paquete diferente, pero solo quiero usar esta otra A en un determinado escenario. Así que puedo hacer algo como esto:

 if(OldVersion): from my.package.location.A import A else: from new.package.location.A import A ... foo = A.doSomething(bar) 

Esto funciona bien. Pero es feo. ¿Cómo puedo hacer esto mejor? Tengo muchas ganas de hacer algo como esto

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

¿Hay alguna manera de hacerlo más fácil? ¿Sin la capa de fábrica? Esto ahora puede convertir todas las llamadas de método estático en mi clase en 2 líneas. Siempre puedo mantener una referencia en una clase para reducir el impacto, pero realmente espero que Python tenga una solución más simple.

Pon tus líneas en a_finder.py:

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

Luego en su código de producto:

 from a_finder import A 

y obtendrás la adecuada A.

Podrías hacer algo como esto:

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 

Luego simplemente import AlwaysRightA as A y listo.

¿Podría simplemente hacer un paquete en una tercera ubicación que verifique OldVersion y obtenga su propia A desde el lugar correcto, y luego siempre importe ese paquete?

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

Algo así?

 old.someFunc() new.someFunc() 

No entendí el punto de la pregunta.