Я натолкнулся на интригующий случай, когда мне приходится подключаться к веб-сервису двумя различными способами, основываясь на предпочтениях потребителей.Для целей этого вопроса я бы предпочел не упоминать какие-либо продукты, скажем, это веб-сервис под названием «Сервис», к которому может обращаться RestAPI и брокер сообщений.
Мой упрощенный код выглядит следующим образом:
import configparser
import os
from MyApp.Exceptions import WrongModeException
class Service(object):
cfg_file = 'path/to/cfg.ini'
config = configparser.ConfigParser()
config.read(cfg_file)
@staticmethod
def generate_password():
return 'ToPsEcReTp4ssw0rD'
class ServiceAPI(Service):
def __init__(self):
self.connection = APIConnect(self.config.some_param)
def do_stuff(self, a):
self.connection.do_stuff(a=a)
class ServiceMessageBroker(Service):
def __init__(self):
self.connection = MessageBrokerConnect(self.config.some_param)
def do_stuff(self, a):
self.connection.do_stuff(a=a)
class ServiceWrapper(Service):
def __init__(self):
mode = self.config.get(option='mode')
if mode == 'Message Broker':
self.service = ServiceMessageBroker()
elif mode == 'API':
self.service = ServiceAPI()
else:
raise WrongModeException
os.sys.exit(1)
def do_stuff(self, **kwargs):
self.service.do_stuff(**kwargs)
if __name__ == '__main__':
s = ServiceWrapper()
s.do_stuff(a='blabla')
Есть ли лучший и более чистый способ сделать это?Я думал о сопоставлении соответствующих функций в словаре, а затем использовал его для выполнения, но мне это кажется ужасно уродливым.
Заранее спасибо!