[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Roundup Robot

Roundup Robot added the comment:

New changeset 7356f71fb0a4 by Yury Selivanov in branch '3.5':
Issue 24316: Fix types.coroutine() to accept objects from Cython
https://hg.python.org/cpython/rev/7356f71fb0a4

New changeset 748c55375225 by Yury Selivanov in branch 'default':
Issue 24316: Fix types.coroutine() to accept objects from Cython
https://hg.python.org/cpython/rev/748c55375225

--
nosy: +python-dev

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Changes by Yury Selivanov yseliva...@gmail.com:


--
resolution:  - fixed
stage: patch review - resolved
status: open - closed

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Stefan Behnel

Stefan Behnel added the comment:

I just noticed that I hadn't used the real types.coroutine in my Py3.5 tests 
when reporting back in issue 24017. When I pass a Cython generator through it, 
I get


Traceback (most recent call last):
  File tests/run/test_coroutines_pep492.pyx, line 245, in 
test_coroutines_pep492.CoroutineTest.test_func_5 
(test_coroutines_pep492.c:13445)
for el in bar():
  File /opt/python3.5/lib/python3.5/types.py, line 197, in wrapped
'non-coroutine: {!r}'.format(coro))
TypeError: callable wrapped with types.coroutine() returned non-coroutine: 
generator object at 0x7f178c458898


This is actually obvious, given that the sole purpose of the decorator is to 
turn something that is a Generator and *not* a Coroutine into something that is 
a Coroutine, as a means for the user to say but I know better. So checking 
for the return value being a Coroutine is wrong. Instead, it should check that 
it's a Generator and if it's not an Awaitable, wrap it as a self-returning 
Awaitable. That's more or less what my proposed implementation in issue 24017 
did:

  class types_coroutine(object):
def __init__(self, gen):
self._gen = gen

class as_coroutine(object):
def __init__(self, gen):
self._gen = gen
self.send = gen.send
self.throw = gen.throw
self.close = gen.close

def __await__(self):
return self._gen

def __call__(self, *args, **kwargs):
return self.as_coroutine(self._gen(*args, **kwargs))

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Stefan Behnel

Stefan Behnel added the comment:

One failing test in test_coroutines: test_func_5. The reason is that the 
GeneratorWrapper is not iterable (and there is no reason it shouldn't be, given 
that it wraps a Generator). That was my fault, I had already added an __iter__ 
method but didn't copy it in my previous message. Adding it as follows fixes 
the test for me:

def __iter__(self):
return self.__wrapped__

Alternatively, __iter__ = __await__ would do the same.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Stefan Behnel

Stefan Behnel added the comment:

BTW, it's not only for compiled generators but also for normal Python functions 
that construct Python generators internally and return them, or that delegate 
the generator creation in some way. With this change, it's enough to decorate 
the constructor function and not each of the potential generators that it 
returns.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Yury Selivanov added the comment:

Please test the attached patch.

 BTW, it's not only for compiled generators but also for normal Python 
 functions that construct Python generators internally and return them

You're right, that's why I used primarily word in that comment ;) 

types.coroutine() is only used by asyncio.coroutine() so far, and returning 
generator objects from factory functions isn't a very common pattern in 
asyncio.

--
Added file: http://bugs.python.org/file39551/types_coroutine.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Changes by Yury Selivanov yseliva...@gmail.com:


--
resolution: fixed - 
status: closed - open

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Yury Selivanov added the comment:

Updated patch. Wrapper now proxies gi_code, gi_running and gi_frame

--
Added file: http://bugs.python.org/file39555/types_coroutine.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Roundup Robot

Roundup Robot added the comment:

New changeset 8080b53342e8 by Yury Selivanov in branch '3.5':
Issue 24316: Wrap gen objects returned from callables in types.coroutine
https://hg.python.org/cpython/rev/8080b53342e8

New changeset c0434ef75177 by Yury Selivanov in branch 'default':
Issue 24316: Wrap gen objects returned from callables in types.coroutine
https://hg.python.org/cpython/rev/c0434ef75177

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Stefan Behnel

Stefan Behnel added the comment:

Ok, now the problem with *this* patch is that __iter__ and __await__ are 
special methods that are being looked up on the type, not the instance. 
Similarly __next__, I think, as it also has its own (type) slot. But I think 
you're right that __next__ is also needed here.

I'm attaching a patch that works for me.

--
Added file: http://bugs.python.org/file39556/types_coroutine.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Yury Selivanov added the comment:

 I'm attaching a patch that works for me.

Looks like we were working in parallel ;)  I've incorporated your changes.  
Please look at the new patch (hopefully this one is final)

--
Added file: http://bugs.python.org/file39557/types_coroutine.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Stefan Behnel

Stefan Behnel added the comment:

Your latest patch works for me.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Yury Selivanov added the comment:

Committed. Thanks, Stefan!

--
resolution:  - fixed
status: open - closed

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-29 Thread Yury Selivanov

Yury Selivanov added the comment:

Stefan, please take a look at this issue #24325 too.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-28 Thread Yury Selivanov

Changes by Yury Selivanov yseliva...@gmail.com:


--
dependencies: +collections.abc: Coroutine should be derived from Awaitable

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24316] Fix types.coroutine to accept objects from Cython

2015-05-28 Thread Yury Selivanov

New submission from Yury Selivanov:

Stefan,

This patch should solve the problem with types.coroutine accepting only pure 
python generator functions.

The approach is, however, slightly different from what you've proposed.  
Instead of having a wrapper class (delegating .throw, .send etc to a wrapped 
object), we now simply check if the returned value of the wrapped function is 
an instance of collections.abc.Coroutine.  Issue 24315 enables duck typing for 
coroutines, so if a cython-based coroutine implements all coroutine abstract 
methods, it will automatically pass types.coroutine.

--
assignee: yselivanov
components: Library (Lib)
files: coroutine.patch
keywords: patch
messages: 244315
nosy: gvanrossum, ncoghlan, scoder, yselivanov
priority: normal
severity: normal
stage: patch review
status: open
title: Fix types.coroutine to accept objects from Cython
versions: Python 3.5, Python 3.6
Added file: http://bugs.python.org/file39536/coroutine.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue24316
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com