[Python-Dev] PEP 492: No new syntax is required (original) (raw)

Yury Selivanov yselivanov.ml at gmail.com
Sun Apr 26 22:40:03 CEST 2015


Hi Mark,

On 2015-04-26 4:21 PM, Mark Shannon wrote:

Hi,

I was looking at PEP 492 and it seems to me that no new syntax is required.

Mark, all your points are explained in the PEP in a great detail:

Looking at the code, it does four things; all of which, or a functional equivalent, could be done with no new syntax.

Yes, everything that the PEP proposes can be done without new syntax.
That's how people use asyncio right now, with only what we have in 3.4.

But it's hard. Iterating through something asynchronously? Write a 'while True' loop. Instead of 1 line you now have 5 or 6. Want to commit your database transaction? Instead of 'async with' you will write 'try..except..finally' block, with a very high probability to introduce a bug, because you don't rollback or commit properly or propagate exception.

1. Make a normal function into a generator or coroutine. This can be done with a decorator.

https://www.python.org/dev/peps/pep-0492/#rationale-and-goals https://www.python.org/dev/peps/pep-0492/#debugging-features https://www.python.org/dev/peps/pep-0492/#importance-of-async-keyword

2. Support a parallel set of special methods starting with 'a' or 'async'. Why not just use the current set of special methods?

Because you can't reuse them.

https://www.python.org/dev/peps/pep-0492/#why-not-reuse-existing-for-and-with-statements https://www.python.org/dev/peps/pep-0492/#why-not-reuse-existing-magic-names

3. "await". "await" is an operator that takes one argument and produces a single result, without altering flow control and can thus be replaced by an function.

It can't be replaced by a function. Only if you use greenlets or Stackless Python.

4. Asynchronous with statement. The PEP lists the equivalent as "with (yield from xxx)" which doesn't seem so bad.

There is no equivalent to 'async with'. "with (yield from xxx)" only allows you to suspend execution in enter (and it's not actually in enter, but in a coroutine that returns a context manager).

https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with see "New Syntax" section to see what 'async with' is equivalent too.

Please don't add unnecessary new syntax.

It is necessary. Perhaps you haven't spent a lot of time maintaining huge code-bases developed with frameworks like asyncio, so I understand why it does look unnecessary to you.

Thanks, Yury



More information about the Python-Dev mailing list