Pregunta

Supongamos que tengo 2 módulos diferentes que tienen las interfaces uniformes (iguales). La lista de archivos es la siguiente:

root/
   logic.py
   sns_api/
      __init__.py
      facebook/
          pyfacebook.py
          __init__.py
      myspace/
          pymyspace.py
          __init__.py

Y pyfacebook.py y pymyspace.py tienen las mismas interfaces, lo que significa:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

# in pymyspace.py
class Myspace:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

Ahora tengo una pregunta. Quiero hacer la lógica en logic.py sin duplicar los códigos, así que me pregunto cómo puedo configurar un indicador para mostrar qué módulo utilizo y python cargará los códigos correctos automáticamente, lo que significa:

# in logic.py

PLATFORM = "facebook"

# import the right modules in, complete the logic with the current platform
# create the right instance and invoke the right methods

Luego cambio PLATFORM = 'myspace', la lógica funcionará automáticamente.

Entonces, ¿cómo puedo hacer esto?

Me pregunto si el uso de la importación dinámica funcionará o si se evalúan códigos de python sin procesar, pero no parece ser una buena solución. O si puedo hacer una envoltura uniforme en

sns_api/__init__.py

¿Alguien puede ayudar?

¿Fue útil?

Solución

Con solo dos lo haría

if platform == 'facebook':
    from pyfacebook import FaceBook as Platform
elif platform == 'myspace':
    from pymyspace import Myspace as Platform
else:
    raise RuntimeError, "not a valid platform"

y use Platform en el resto del código. Se hace así en la biblioteca, consulte el módulo os .

Puede realizar importaciones realmente dinámicas utilizando name = < código> __ import__ ('módulo') , pero probablemente no necesite esto.

Otros consejos

Tener una " fábrica " funcione en cada módulo, realice la importación dinámica y llame a la fábrica para obtener el módulo cargado. Al menos, esa es una manera de hacerlo. Recuerde, la forma pitónica es " tipografía de pato " para que la fábrica devuelva un objeto y el cliente lo use a través de " llamadas a duck " :-)

También puedes usar exec:

exec "from sns_api.%s import Platform" % PLATFORM

Luego, en tus archivos de implementación, asigna algo a la plataforma:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

Platform = Facebook
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top