PEP原文:https://www.python.org/dev/peps/pep-0530
PEP标題:PEP 530 -- Asynchronous Comprehensions
PEP作者:Yury Selivanov
建立日期:2016-09-03
合入版本:3.6
譯者:豌豆花下貓@Python貓
PEP翻譯計劃:https://github.com/chinesehuazhou/peps-cn
PEP-492 和 PEP-525 通過 async/await 文法,引入了對原生協程和異步生成器的支援。本 pep 提議給清單、集合、字典解析式和生成器表達式添加異步的版本。
Python 廣泛地支援同步的推導式,允許使用簡單而簡潔的文法生成清單、字典和集合。我們提議為異步代碼實作類似的文法結構。
為了說明可讀性的改善,請考慮下面的例子:
有了提議的異步解析式文法,上面的代碼會變得非常簡短:
本 PEP 也使得在各種解析式中使用 await 表達式成為可能:
我們提議允許在清單、集合與字典解析式中使用 async。待 PEP-525 被準許之後,我們還可以建立異步的生成器表達式。
例子:
集合解析式:{i async for i in agen()}
清單解析式:[i async for i in agen()]
字典解析式:{i: i ** 2 async for i in agen()}
生成器表達式:(i ** 2 async for i in agen())
允許在異步解析式和生成器表達式中使用 async for 與 if 以及 for 子句:
異步解析式隻允許在“async def”函數中使用。
原則上,異步生成器表達式允許用在任何上下文中。然而,在 Python 3.6 中,由于 async 和 await 隻是“軟關鍵字”(soft-keyword),異步生成器表達式隻允許在 async def 函數中使用。一旦 async 和 await 在 Python 3.7 中成為保留關鍵字,這個限制将被移除。
我們提議允許在異步和同步解析式中使用 await 表達式:
這隻在 async def 函數體中有效。
本提議需要在文法層面做一個修改:在 comp_for 中添加可選的“async”關鍵字:
解析式的 AST 節點将有一個新的 is_async 參數。
本提案是完全向後相容的。
在 2016 年 9 月 6 日[1],PEP-530 被 Guido 接受。
1、 https://mail.python.org/pipermail/python-ideas/2016-September/042141.html
2、https://github.com/1st1/cpython/tree/asyncomp
3、http://bugs.python.org/issue28008
感謝 Guido van Rossum、Victor Stinner 和 Elvis pranskevichuss 對于這個 pep 的回報、代碼檢視和讨論。
本文檔已進入公共領域。
源檔案:https://github.com/python/peps/blob/master/pep-0530.txt