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.

classification
Title: types.coroutine monkey patches original function
Type: behavior Stage:
Components: asyncio Versions: Python 3.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: yselivanov Nosy List: Omnifarious, r.david.murray, yselivanov
Priority: normal Keywords:

Created on 2017-03-26 08:59 by Omnifarious, last changed 2022-04-11 14:58 by admin.

Files
File name Uploaded Description Edit
types.coroutine.py Omnifarious, 2017-03-27 00:03 A possible fix
Messages (5)
msg290518 - (view) Author: Eric Hopper (Omnifarious) Date: 2017-03-26 08:59
The types.coroutine decorator for Python 3.6 (and I suspect for Python 3.6.1 as well) simply monkey patches the function it's passed and then returns it. This results in behavior that I found somewhat surprising.

def bar():
   yield 5

foo = types.coroutine(bar)

foo is bar

And, so now both foo and bar are now awaitable. I wasn't really expecting this, and while it's minor, it also doesn't really seem like the right thing to do.
msg290532 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2017-03-26 15:08
Yes, that looks wrong to me.  IMO it should be returning a new function object, not updating the __code__ of the existing object.  I couldn't figure when that is actually triggered, though.  

There are also some other oddnesses, given the definition of 'coroutine' in the 'types' module docs.  type(x) returns 'coroutine' only when you actually *call* the async def function.  I think that's correct, but the docs need rewording.  However, if I call coroutine on the equivalent non-async-def generator, types(x()) returns generator, not coroutine.  So it doesn't seem to be doing what it says on the label, at least not in all cases.
msg290534 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2017-03-26 15:13
Oops, I didn't meant to close this.
msg290538 - (view) Author: Yury Selivanov (yselivanov) * (Python committer) Date: 2017-03-26 16:43
Yeah, we can fix this. However, I don't want to push the fix to 3.6, too much code uses this function now. So it's going to be 3.7 only.
msg290551 - (view) Author: Eric Hopper (Omnifarious) Date: 2017-03-27 00:03
Here's an update to types.coroutine that fixes the problem for me.
History
Date User Action Args
2022-04-11 14:58:44adminsetgithub: 74095
2017-03-27 00:03:13Omnifarioussetfiles: + types.coroutine.py

messages: + msg290551
2017-03-26 16:43:21yselivanovsetassignee: yselivanov
messages: + msg290538
versions: + Python 3.7, - Python 3.6
2017-03-26 15:13:36r.david.murraysetstatus: closed -> open
resolution: not a bug ->
messages: + msg290534

stage: resolved ->
2017-03-26 15:08:21r.david.murraysetstatus: open -> closed

nosy: + r.david.murray
messages: + msg290532

resolution: not a bug
stage: resolved
2017-03-26 08:59:57Omnifariouscreate