This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author mjpieters
Recipients mjpieters
Date 2019-10-03.13:28:43
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1570109324.07.0.792957059658.issue38364@roundup.psfhosted.org>
In-reply-to
Content
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
History
Date User Action Args
2019-10-03 13:28:44mjpieterssetrecipients: + mjpieters
2019-10-03 13:28:44mjpieterssetmessageid: <1570109324.07.0.792957059658.issue38364@roundup.psfhosted.org>
2019-10-03 13:28:44mjpieterslinkissue38364 messages
2019-10-03 13:28:43mjpieterscreate