← 返回首页
`inspect.iscoroutinefunction()` does not detect marked partial objects · Issue #142418 · python/cpython · GitHub
Skip to content

Navigation Menu

Toggle navigation
Sign in
Appearance settings
Search or jump to...

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Resetting focus

inspect.iscoroutinefunction() does not detect marked partial objects #142418

New issue
New issue

Description

Bug report

Bug description:

inspect.markcoroutinefunction() is applied directly to the passed function, except for methods (which is correct behavior). However, inspect.iscoroutinefunction() checks the passed function only after unwrapping (a function that is not wrapped in either functools.partial or functools.partialmethod (currently, _has_coroutine_mark() does not handle these objects; why?)), and thus cannot detect the marker that is not at the end of the unwrapping chain, which results in false negative in cases where a functools.partial/functools.partialmethod object is marked.

>>> from functools import partial >>> from inspect import iscoroutinefunction, markcoroutinefunction >>> async def wedonotlikesnakecase(): ... return "the_funniest_joke_in_the_world" >>> def manufacturer_of_jokes(somefunc): ... global manufacturer_of_jokes ... del manufacturer_of_jokes ... return somefunc() >>> joke = partial(manufacturer_of_jokes, wedonotlikesnakecase) >>> joke = markcoroutinefunction(joke) >>> iscoroutinefunction(joke) False

I discovered this problem while theoretically considering backporting inspect.iscoroutinefunction() to older versions of Python. The problem has not yet been caused by any use case, so it is okay if the issue is closed due to lack of demand. But just in case, I am attaching part of how iscoroutinefunction() is implemented in my code.

def iscoroutinefunction(obj): marker_name, marker_value = _get_coroutinefunction_marker() while True: # unwrap & check if ismethod(obj): obj = obj.__func__ continue if marker_value is not MISSING: if getattr(obj, marker_name, MISSING) is marker_value: return True if isinstance(obj, partial): obj = obj.func continue impl = getattr(obj, _partialmethod_attribute_name, MISSING) if isinstance(impl, partialmethod): obj = impl.func continue # unlike its namesake in the `inspect` module, it does not unwrap return _has_code_flag(obj, CO_COROUTINE)

CPython versions tested on:

3.12, 3.13, 3.14

Operating systems tested on:

Linux

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    • Open in GitHub Copilot app

    Footer

    © 2026 GitHub, Inc.