Add a coroutine_wrapper decorator
This decorator checks for the coroutine=True keyword arg and wraps the result of the function call in a coroutine if it isn’t. This allows to have constructs like: @coroutine_wrapper def toto(xmpp, *, coroutine=False): if xmpp.cached: return xmpp.cached else: return xmpp.make_iq_get().send(coroutine=coroutine) @asyncio.coroutine def main(xmpp): result = yield from toto(xmpp, coroutine=True) xmpp.cached = result result2 = yield from toto(xmpp, coroutine=True) If the wrapper wasn’t there, the second fetch would fail. This decorator does not do anything if the coroutine argument is False.
This commit is contained in:
parent
1450d36377
commit
8fd0d7c993
@ -8,6 +8,7 @@ call_soon() ones. These callback are called only once each.
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from asyncio import events
|
from asyncio import events
|
||||||
|
from functools import wraps
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
|
|
||||||
@ -32,3 +33,23 @@ cls.idle_call = idle_call
|
|||||||
real_run_once = cls._run_once
|
real_run_once = cls._run_once
|
||||||
cls._run_once = my_run_once
|
cls._run_once = my_run_once
|
||||||
|
|
||||||
|
|
||||||
|
def coroutine_wrapper(func):
|
||||||
|
"""
|
||||||
|
Make sure the result of a function call is a coroutine
|
||||||
|
if the ``coroutine`` keyword argument is true.
|
||||||
|
"""
|
||||||
|
def wrap_coro(result):
|
||||||
|
if asyncio.iscoroutinefunction(result):
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
return asyncio.coroutine(lambda: result)()
|
||||||
|
|
||||||
|
@wraps(func)
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
if kwargs.get('coroutine', False):
|
||||||
|
return wrap_coro(func(*args, **kwargs))
|
||||||
|
else:
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
Loading…
x
Reference in New Issue
Block a user