Message353849
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 |
|
Date |
User |
Action |
Args |
2019-10-03 13:28:44 | mjpieters | set | recipients:
+ mjpieters |
2019-10-03 13:28:44 | mjpieters | set | messageid: <1570109324.07.0.792957059658.issue38364@roundup.psfhosted.org> |
2019-10-03 13:28:44 | mjpieters | link | issue38364 messages |
2019-10-03 13:28:43 | mjpieters | create | |
|