1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python 列表解析式竟然支持異步?

        共 4056字,需瀏覽 9分鐘

         ·

        2021-08-16 10:00

        △點(diǎn)擊上方“Python貓”關(guān)注 ,回復(fù)“1”領(lǐng)取電子書(shū)
        花下貓語(yǔ):近期一直在忙于其它事,導(dǎo)致沒(méi)有創(chuàng)作新文章,甚至日常發(fā)文也變得稀少了。我想到一個(gè)稍微改變這種不良局面的辦法,那就是找一些文章/文檔來(lái)翻譯,因?yàn)榭梢岳蒙舷掳嗤ㄇ诩拔缧葸@種碎片時(shí)間。今天發(fā)的還是一篇PEP譯文,可能價(jià)值不是很大吧,但也算是擠著時(shí)間做了一點(diǎn)實(shí)際的事。如果你看到不錯(cuò)的英文技術(shù)文章,或者很感興趣的PEP文檔,歡迎給我留言,我酌情翻譯。

        PEP原文:https://www.python.org/dev/peps/pep-0530
        PEP標(biāo)題:PEP 530 -- Asynchronous Comprehensions
        PEP作者:Yury Selivanov
        創(chuàng)建日期:2016-09-03
        合入版本:3.6
        譯者:豌豆花下貓@Python貓

        PEP翻譯計(jì)劃:https://github.com/chinesehuazhou/peps-cn

        摘要

        PEP-492 和 PEP-525 通過(guò) async/await 語(yǔ)法,引入了對(duì)原生協(xié)程和異步生成器的支持。本 pep 提議給列表、集合、字典解析式和生成器表達(dá)式添加異步的版本。

        基本原理和目標(biāo)

        Python 廣泛地支持同步的推導(dǎo)式,允許使用簡(jiǎn)單而簡(jiǎn)潔的語(yǔ)法生成列表、字典和集合。我們提議為異步代碼實(shí)現(xiàn)類(lèi)似的語(yǔ)法結(jié)構(gòu)。

        為了說(shuō)明可讀性的改善,請(qǐng)考慮下面的例子:

        result = []
        async for i in aiter():
            if i % 2:
                result.append(i)

        有了提議的異步解析式語(yǔ)法,上面的代碼會(huì)變得非常簡(jiǎn)短:

        result = [i async for i in aiter() if i % 2]

        本 PEP 也使得在各種解析式中使用 await 表達(dá)式成為可能:

        result = [await fun() for fun in funcs]

        規(guī)范

        異步的解析式

        我們提議允許在列表、集合與字典解析式中使用 async。待 PEP-525 被批準(zhǔn)之后,我們還可以創(chuàng)建異步的生成器表達(dá)式。

        例子:

        • 集合解析式:{i async for i in agen()}
        • 列表解析式:[i async for i in agen()]
        • 字典解析式:{i: i ** 2 async for i in agen()}
        • 生成器表達(dá)式:(i ** 2 async for i in agen())

        允許在異步解析式和生成器表達(dá)式中使用 async for 與 if 以及 for 子句:

        dataset = {data for line in aiter()
                        async for data in line
                        if check(data)}
        data = {data for line in aiter() async for data in line if check(data)}

        異步解析式只允許在“async def”函數(shù)中使用。

        原則上,異步生成器表達(dá)式允許用在任何上下文中。然而,在 Python 3.6 中,由于 async 和 await 只是“軟關(guān)鍵字”(soft-keyword),異步生成器表達(dá)式只允許在 async def 函數(shù)中使用。一旦 async 和 await 在 Python 3.7 中成為保留關(guān)鍵字,這個(gè)限制將被移除。

        解析式中的 await

        我們提議允許在異步和同步解析式中使用 await 表達(dá)式:

        result = [await fun() for fun in funcs]
        result = {await fun() for fun in funcs}
        result = {fun: await fun() for fun in funcs}

        result = [await fun() for fun in funcs if await smth]
        result = {await fun() for fun in funcs if await smth}
        result = {fun: await fun() for fun in funcs if await smth}

        result = [await fun() async for fun in funcs]
        result = {await fun() async for fun in funcs}
        result = {fun: await fun() async for fun in funcs}

        result = [await fun() async for fun in funcs if await smth]
        result = {await fun() async for fun in funcs if await smth}
        result = {fun: await fun() async for fun in funcs if await smth}

        這只在 async def 函數(shù)體中有效。

        語(yǔ)法的更新

        本提議需要在語(yǔ)法層面做一個(gè)修改:在 comp_for 中添加可選的“async”關(guān)鍵字:

        comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]

        解析式的 AST 節(jié)點(diǎn)將有一個(gè)新的 is_async 參數(shù)。

        向后兼容性

        本提案是完全向后兼容的。

        接受

        在 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 對(duì)于這個(gè) pep 的反饋、代碼檢視和討論。

        版權(quán)

        本文檔已進(jìn)入公共領(lǐng)域。

        源文件:https://github.com/python/peps/blob/master/pep-0530.txt

        Python貓技術(shù)交流群開(kāi)放啦!群里既有國(guó)內(nèi)一二線大廠在職員工,也有國(guó)內(nèi)外高校在讀學(xué)生,既有十多年碼齡的編程老鳥(niǎo),也有中小學(xué)剛剛?cè)腴T(mén)的新人,學(xué)習(xí)氛圍良好!想入群的同學(xué),請(qǐng)?jiān)诠?hào)內(nèi)回復(fù)『交流群』,獲取貓哥的微信(謝絕廣告黨,非誠(chéng)勿擾?。?/span>~


        還不過(guò)癮?試試它們




        技術(shù)人生:淺談如何成為技術(shù)一號(hào)位?

        Python 為什么使用縮進(jìn)來(lái)劃分代碼塊?

        Python 協(xié)程的本質(zhì)?原來(lái)也不過(guò)如此

        Python 如何讀取文件?fileinput 是個(gè)不錯(cuò)的選擇

        Python 工匠:使用裝飾器的技巧

        Python 為什么能支持任意的真值判斷?


        如果你覺(jué)得本文有幫助
        請(qǐng)慷慨分享點(diǎn)贊,感謝啦!
        瀏覽 27
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            爱福利视频一区二区 | 国产精品99久久久久久久鸭无压 | 欧美亚洲老女人屄操老男人 | 美女的胸又黄又大jk | 女奥特曼被到爽羞羞动态 | 激情网站在线观看 | 开心五月激情五月综合久久中文字幕 | 风流少妇被粗大爽 | 天天操伊人| 国产性生活毛片 |