diff options
Diffstat (limited to 'Lib/inspect.py')
-rw-r--r-- | Lib/inspect.py | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py index 25ddd26c66..6285a6cdd5 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -175,8 +175,7 @@ def isgeneratorfunction(object): See help(isfunction) for attributes listing.""" return bool((isfunction(object) or ismethod(object)) and - object.__code__.co_flags & CO_GENERATOR and - not object.__code__.co_flags & CO_COROUTINE) + object.__code__.co_flags & CO_GENERATOR) def iscoroutinefunction(object): """Return true if the object is a coroutine function. @@ -185,8 +184,7 @@ def iscoroutinefunction(object): or generators decorated with "types.coroutine". """ return bool((isfunction(object) or ismethod(object)) and - object.__code__.co_flags & (CO_ITERABLE_COROUTINE | - CO_COROUTINE)) + object.__code__.co_flags & CO_COROUTINE) def isawaitable(object): """Return true if the object can be used in "await" expression.""" @@ -207,12 +205,11 @@ def isgenerator(object): send resumes the generator and "sends" a value that becomes the result of the current yield-expression throw used to raise an exception inside the generator""" - return (isinstance(object, types.GeneratorType) and - not object.gi_code.co_flags & CO_COROUTINE) + return isinstance(object, types.GeneratorType) def iscoroutine(object): """Return true if the object is a coroutine.""" - return isinstance(object, collections.abc.Coroutine) + return isinstance(object, types.CoroutineType) def istraceback(object): """Return true if the object is a traceback. @@ -1598,6 +1595,45 @@ def getgeneratorlocals(generator): else: return {} + +# ------------------------------------------------ coroutine introspection + +CORO_CREATED = 'CORO_CREATED' +CORO_RUNNING = 'CORO_RUNNING' +CORO_SUSPENDED = 'CORO_SUSPENDED' +CORO_CLOSED = 'CORO_CLOSED' + +def getcoroutinestate(coroutine): + """Get current state of a coroutine object. + + Possible states are: + CORO_CREATED: Waiting to start execution. + CORO_RUNNING: Currently being executed by the interpreter. + CORO_SUSPENDED: Currently suspended at an await expression. + CORO_CLOSED: Execution has completed. + """ + if coroutine.cr_running: + return CORO_RUNNING + if coroutine.cr_frame is None: + return CORO_CLOSED + if coroutine.cr_frame.f_lasti == -1: + return CORO_CREATED + return CORO_SUSPENDED + + +def getcoroutinelocals(coroutine): + """ + Get the mapping of coroutine local variables to their current values. + + A dict is returned, with the keys the local variable names and values the + bound values.""" + frame = getattr(coroutine, "cr_frame", None) + if frame is not None: + return frame.f_locals + else: + return {} + + ############################################################################### ### Function Signature Object (PEP 362) ############################################################################### |