2011-07-22 13 views
7

Ahora mismo tengo una clase llamada A.Python, haciendo las importaciones condicionales de la manera correcta

tengo algo de código como este ..

from my.package.location.A import A 

... 


foo = A.doSomething(bar) 

Esto es grande.

Pero ahora tengo una nueva versión de un llamado A, pero en un paquete diferente, pero yo sólo quiero usar este otro A en un determinado escenario. Entonces 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? Realmente quiero 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 que pueda hacer eso más fácil? Sin la capa de fábrica? Esto ahora puede convertir cada llamada 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.

Respuesta

13

Ponga sus 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 el código de producto:

from a_finder import A 

y obtendrá la correcta A.

+0

Así es exactamente como Python "simplemente funciona" :) –

1

Podría usted acaba de hacer un paquete en una tercera ubicación que comprueba OldVersion y obtiene su propia A desde el lugar correcto, entonces siempre importar ese paquete?

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

algo como eso?

old.someFunc() 
new.someFunc() 

No llegué al punto de la pregunta.

+0

Creo que se puede retraer su respuesta si no entiendes el punto ... – sage

+0

@sage Lol. Hace 4 años no pude hacer ningún comentario porque no había representantes. Entonces lo publico como una respuesta para obtener más información. – Jaxedin

2

se podría 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 

Después, simplemente import AlwaysRightA as A y listo.

Cuestiones relacionadas