mirror of
https://github.com/python/cpython.git
synced 2025-08-23 10:16:01 +00:00
bpo-34890: Make iscoroutinefunction, isgeneratorfunction and isasyncgenfunction work with functools.partial (GH-9903)
inspect.isfunction() processes both inspect.isfunction(func) and inspect.isfunction(partial(func, arg)) correctly but some other functions in the inspect module (iscoroutinefunction, isgeneratorfunction and isasyncgenfunction) lack this functionality. This commits adds a new check in the mentioned functions in the inspect module so they can work correctly with arbitrarily nested partial functions.
This commit is contained in:
parent
e483f02423
commit
7cd2543416
6 changed files with 61 additions and 12 deletions
|
@ -168,30 +168,33 @@ def isfunction(object):
|
|||
__kwdefaults__ dict of keyword only parameters with defaults"""
|
||||
return isinstance(object, types.FunctionType)
|
||||
|
||||
def isgeneratorfunction(object):
|
||||
def isgeneratorfunction(obj):
|
||||
"""Return true if the object is a user-defined generator function.
|
||||
|
||||
Generator function objects provide the same attributes as functions.
|
||||
See help(isfunction) for a list of attributes."""
|
||||
return bool((isfunction(object) or ismethod(object)) and
|
||||
object.__code__.co_flags & CO_GENERATOR)
|
||||
obj = functools._unwrap_partial(obj)
|
||||
return bool((isfunction(obj) or ismethod(obj)) and
|
||||
obj.__code__.co_flags & CO_GENERATOR)
|
||||
|
||||
def iscoroutinefunction(object):
|
||||
def iscoroutinefunction(obj):
|
||||
"""Return true if the object is a coroutine function.
|
||||
|
||||
Coroutine functions are defined with "async def" syntax.
|
||||
"""
|
||||
return bool((isfunction(object) or ismethod(object)) and
|
||||
object.__code__.co_flags & CO_COROUTINE)
|
||||
obj = functools._unwrap_partial(obj)
|
||||
return bool(((isfunction(obj) or ismethod(obj)) and
|
||||
obj.__code__.co_flags & CO_COROUTINE))
|
||||
|
||||
def isasyncgenfunction(object):
|
||||
def isasyncgenfunction(obj):
|
||||
"""Return true if the object is an asynchronous generator function.
|
||||
|
||||
Asynchronous generator functions are defined with "async def"
|
||||
syntax and have "yield" expressions in their body.
|
||||
"""
|
||||
return bool((isfunction(object) or ismethod(object)) and
|
||||
object.__code__.co_flags & CO_ASYNC_GENERATOR)
|
||||
obj = functools._unwrap_partial(obj)
|
||||
return bool((isfunction(obj) or ismethod(obj)) and
|
||||
obj.__code__.co_flags & CO_ASYNC_GENERATOR)
|
||||
|
||||
def isasyncgen(object):
|
||||
"""Return true if the object is an asynchronous generator."""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue