Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-94912: Adjusted check for non-standard coroutine function marker. #100935

Merged
merged 1 commit into from
Jan 11, 2023

Conversation

carltongibson
Copy link
Contributor

@carltongibson carltongibson commented Jan 11, 2023

The initial implementation did not correctly identify explicitly marked class instances.

Follow up to 532aa4e from #99247
(Bug in Python 3.12.0a4)

Integrating Python 3.12.0a4 with the Django test suite we see that the _has_coroutine_mark() is not allowing the key case of a class being marked as an asynchronous callable. (This is my fault: in the discussion with @gvanrossum on #99247 over whether we'd cover the marked and async def __call__ cases automatically, I forgot to add the explicit test for the marked instances.)

I note the isfunction(f) or _signature_is_functionlike(f) restriction is untested, and not, I think, necessary. (If folks applied markcoroutinefunction, I think we have to assume that they know what they're up to.)

…rker.

The initial implementation did not correctly identify explicitly
marked class instances.

Follow up to 532aa4e
@carltongibson
Copy link
Contributor Author

I think this could skip news? 🤔

@felixxm
Copy link
Contributor

felixxm commented Jan 11, 2023

Confirming this resolves the issues for Django ✔️ Thanks!

@@ -399,8 +399,6 @@ def _has_coroutine_mark(f):
while ismethod(f):
f = f.__func__
f = functools._unwrap_partial(f)
if not (isfunction(f) or _signature_is_functionlike(f)):
Copy link
Member

@sobolevn sobolevn Jan 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What else can we mark as coroutine-like? Functions, methods, other callables like partial, classes. Anything else?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @sobolevn. I'm not sure I follow 🤔

The cases that have occurred up to Python 3.11, using the old asyncio version, have been callable classes and sync functions. Those are (now) covered. We also added tests for static and class method and lambdas (but I've not seen anyone using those).

The other case that would simplify client code is automatic detection of the __call__ method (either async def or marked) but I think the preference is not to add that.

Copy link
Member

@gvanrossum gvanrossum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. I will merge this.

@gvanrossum gvanrossum merged commit 07a87f7 into python:main Jan 11, 2023
@carltongibson carltongibson deleted the fix-issue-94912 branch January 22, 2023 13:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants