[Python-Dev] PEP 492: async/await in Python; v3

Yury Selivanov yselivanov.ml at gmail.com
Wed Apr 29 06:10:45 CEST 2015



On 2015-04-28 11:59 PM, Greg wrote:
> On 29/04/2015 9:49 a.m., Guido van Rossum wrote:
>>     c) 'yield from' only accept coroutine objects from
>>     generators decorated with 'types.coroutine'. That means
>>     that existing asyncio generator-based coroutines will
>>     happily yield from both coroutines and generators.
>>     *But* every generator-based coroutine *must* be
>>     decorated with `asyncio.coroutine()`.  This is
>>     potentially a backwards incompatible change.
>>
>> See below. I worry about backward compatibility. A lot. Are you saying
>> that asycio-based code that doesn't use @coroutine will break in 3.5?
>
> That seems unavoidable if the goal is for 'await' to only
> work on generators that are intended to implement coroutines,
> and not on generators that are intended to implement
> iterators. Because there's no way to tell them apart
> without marking them in some way.
>

Not sure what you mean by "unavoidable".

Before the last revision of the PEP it was perfectly fine
to use generators in 'yield from' in generator-based coroutines:

    @asyncio.coroutine
    def foo():
       yield from gen()

and yet you couldn't do the same with 'await' (as it has
a special opcode instead of GET_ITER that can validate
what you're awaiting).

With the new version of the PEP - 'yield from' in foo()
would raise a TypeError.  If we change it to a RuntimeWarning
then we're safe in terms of backwards compatibility. I just
want to see how exactly warnings will work (i.e. will they
occur multiple times at the same 'yield from' expression, etc)

Yury


More information about the Python-Dev mailing list