¿Cómo puedo escribir asyncio coroutines que opcionalmente actúen como funciones regulares?
Estoy escribiendo una biblioteca que me gustaría que los usuarios finales puedan usar opcionalmente como si sus métodos y funciones no fueran rutinas.
Por ejemplo, dada esta función:
@asyncio.coroutine
def blah_getter():
return (yield from http_client.get('http://blahblahblah'))
Un usuario final a quien no le importa usar ninguna función asincrónica en su propio código, aún debe importar asyncio y ejecutar esto:
>>> response = asyncio.get_event_loop().run_until_complete(blah_getter())
Sería genial si pudiera, dentro deblah_getter
determinar si me llamaban como corutina o no y reaccionar en consecuencia.
Entonces algo como:
@asyncio.coroutine
def blah_getter():
if magically_determine_if_being_yielded_from():
return (yield from http_client.get('http://blahblahblah'))
else:
el = asyncio.get_event_loop()
return el.run_until_complete(http_client.get('http://blahblahblah'))