Wie kann ich asynchrone Coroutinen schreiben, die optional als reguläre Funktionen fungieren?

Ich schreibe eine Bibliothek, die Endbenutzer optional verwenden können sollen, als ob ihre Methoden und Funktionen keine Coroutinen wären.

Zum Beispiel mit dieser Funktion:

@asyncio.coroutine
def blah_getter():
    return (yield from http_client.get('http://blahblahblah'))

Ein Endbenutzer, der keine asynchronen Funktionen in seinem eigenen Code verwenden möchte, muss weiterhin asyncio importieren und Folgendes ausführen:

>>> response = asyncio.get_event_loop().run_until_complete(blah_getter())

Es wäre cool, wenn ich könnte, innerhalb vonblah_getter Ermitteln Sie, ob ich als Coroutine angerufen wurde oder nicht, und reagieren Sie entsprechend.

So etwas wie:

@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'))

Antworten auf die Frage(6)

Ihre Antwort auf die Frage