[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