2016-11-20 2 views
1

In Python versuche ich eine API für ein verbundenes Gerät zu erstellen. Ich möchte sowohl für Threaded (mit Anfrage) als auch für Async-Anwendungen (mit aiohttp) verfügbar sein. Was ich mir ausgedacht habe, ist das Wrapping der Get-Methode von requests und aiohttp in einem Decorator. Dieser Decorator wird bei init übergeben und API-Aufrufe werden explizit mit dem übergebenen Decorator umbrochen.Threaded und Asyncio API-Bibliothek

Es funktioniert, aber ich würde gerne wissen, wie andere über diesen Ansatz denken? Gibt es bessere Wege oder werde ich später auf Probleme stoßen?

Jede Hilfe wird geschätzt!

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

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da die Frage nach einem Code-Review unter http://codereview.stackexchange.com –

+0

@KlausD gefragt werden sollte. Diese Frage wurde [cross-posted in Code Review] (http://codereview.stackexchange.com/q/147586/9357) gestellt, aber sie wird derzeit nicht gelesen, da der Code zu hand-wellig ist, um als funktionierender Code betrachtet zu werden . –

+0

@ 200_success Danke für die Info, aber das macht hier keinen Unterschied. –

Antwort

0

Ihr Code ist nicht vollständig, aber ja, der Ansatz könnte in einfachen Fällen arbeiten (wenn .process_response() sehr allgemein gehalten ist und könnte für alle API-Aufrufe verwendet werden).