Issue 29909: types.coroutine monkey patches original function (original) (raw)

Issue29909

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:44 admin set github: 74095
2017-03-27 00:03:13 Omnifarious set files: + types.coroutine.pymessages: +
2017-03-26 16:43:21 yselivanov set assignee: yselivanovmessages: + versions: + Python 3.7, - Python 3.6
2017-03-26 15:13:36 r.david.murray set status: closed -> openresolution: not a bug -> messages: + stage: resolved ->
2017-03-26 15:08:21 r.david.murray set status: open -> closednosy: + r.david.murraymessages: + resolution: not a bugstage: resolved
2017-03-26 08:59:57 Omnifarious create