Carga diferentes módulos sin cambiar el archivo lógico.
-
05-07-2019 - |
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?
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