New submission from Martijn Pieters <[email protected]>:
This is a follow-up to #33261, which added general support for detecting
generator / coroutine / async generator functions wrapped in partials. It
appears that partialmethod objects were missed out.
While a partialmethod object will produce a functools.partial() object on
binding to an instance, the .func attribute of that partial is a bound method,
not a function, and the current _has_code_flag implementation unwraps methods
*before* it unwraps partials.
Next, binding to a class produces a
partialmethod._make_unbound_method.<locals>._method wrapper function.
_unwrap_partial can't unwrap this, as it doesn't handle this case; it could
look for the `_partialmethod` attribute and follow that to find the `.func`
attribute.
Test case:
import inspect
import functools
class Foo:
async def bar(self, a): return a
ham = partialmethod(bar, "spam")
print(inspect.iscoroutinefunction(Foo.bar) # True
print(inspect.iscoroutinefunction(Foo.ham) # False
instance = Foo()
print(inspect.iscoroutinefunction(instance.bar) # True
print(inspect.iscoroutinefunction(instance.ham) # False
----------
components: Library (Lib)
messages: 353849
nosy: mjpieters
priority: normal
severity: normal
status: open
title: inspect.iscoroutinefunction / isgeneratorfunction / isasyncgenfunction
can't handle partialmethod objects
type: behavior
versions: Python 3.8
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue38364>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com