2016-11-20 9 views
1

В Python Я пытаюсь создать API для подключенного устройства. Я хочу быть доступным как для потоков (с использованием запроса), так и для асинхронных приложений (с использованием aiohttp). То, что я придумал, это обернуть метод получения как requests, так и aiohttp в декораторе. Этот декоратор передается при вызове init, и API-вызовы явно завертываются с использованием прошедшего декоратора.API-интерфейс с резьбой и асинхронным API

Это работает, но я хотел бы знать, как другие думают об этом подходе? Есть ли лучшие способы или я буду сталкиваться с проблемами позже?

Любая помощь оценена!

def threaded_gett(function): 
    # The threaded decorator 
    def wrapper(*args, **kwargs): 
     url, params = function(*args) 
     response = requests.get(url, params) 
     _json = response.json() 
     return function.__self__.process_response(_json) 

    return wrapper 

def async_gett(function): 
    # The async decorator 
    def wrapper(*args, **kwargs): 
     url, params = function(*args) 
     try: 
      resp = yield from function.__self__.session.get(url, params=params) 
     except Exception as ex: 
      lgr.exception(ex) 
     else: 
      _json = yield from resp.json() 
      yield from resp.release() 
      return function.__self__.process_response(_json) 

    # wrapping the decorator in the async coroutine decorator. 
    wrapper = asyncio.coroutine(wrapper) 
    return wrapper 


class ThreadedApi(BaseApi): 
    def __init__(self,threaded_gett): 
     Base.__init(self,threaded_gett) 


class AsyncApi(BaseApi): 
    def __init__(self,async_gett): 
     Base.__init(self,async_gett) 


class BaseApi(): 
    def __init__(self,get_wrapper): 
     self.status = get_wrapper(self.status) 

    def status(self): 
     return <status path> 
+0

Я голосующий, чтобы закрыть этот вопрос не по теме, потому что вопрос с запросом на проверку кода должен быть задан по адресу http://codereview.stackexchange.com –

+0

@KlausD. Этот вопрос был [перекрестно размещен в обзоре кода] (http://codereview.stackexchange.com/q/147586/9357), но он в настоящее время приостановлен, потому что код слишком ручно-волнистый, чтобы считаться рабочим кодом , –

+0

@ 200_success Спасибо за информацию, но здесь это не имеет никакого значения. –

ответ

0

Ваш код не является полным, но да, такой подход может работать в простых случаях (когда .process_response() очень общий характер и могут быть применены ко всем вызовам API).