日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python 3.10 的首個 PEP 誕生,內(nèi)置類型 zip() 迎來新特性(推薦)

瀏覽:24日期:2022-07-18 18:15:00

譯者前言:相信凡是用過 zip() 內(nèi)置函數(shù)的人,都會贊同它很有用,但是,它的最大問題是可能會產(chǎn)生出非預(yù)期的結(jié)果。PEP-618 提出給它增加一個參數(shù),可以有效地解決大家的痛點。

這是 Python 3.10 版本正式采納的第一個 PEP,「Python貓」一直有跟進社區(qū)最新動態(tài)的習慣,所以翻譯了出來給大家嘗鮮,強烈推薦一讀。(PS:嚴格來說,zip() 是一個內(nèi)置類(built-in type),而不是一個內(nèi)置函數(shù)(built-in function),但我們一般都稱它為一個內(nèi)置函數(shù)。)

PEP原文 : https://www.python.org/dev/peps/pep-0618/

PEP標題: Add Optional Length-Checking To zip

PEP作者: Brandt Bucher

創(chuàng)建日期: 2020-05-01

合入版本: 3.10

PEP翻譯計劃 :https://github.com/chinesehuazhou/peps-cn

摘要

本 PEP 建議給內(nèi)置的 zip 添加一個可選的 strict 布爾關(guān)鍵字參數(shù)。當啟用時,如果其中一個參數(shù)先被用盡了,則會引發(fā) ValueError 。

動機

從作者的個人經(jīng)驗和一份對標準庫的調(diào)查 來看,明顯有很多(如果不是絕大多數(shù))zip 用例要求可迭代對象必須是等長的。有時候,周圍代碼的上下文可以保證這點,但是要 zip 處理的數(shù)據(jù)通常是由調(diào)用者傳入的、單獨提供的或者以某種方式生成的。在這些情況下,zip 的默認行為意味著錯誤的重構(gòu)或邏輯錯誤,很容易悄悄地導(dǎo)致數(shù)據(jù)丟失。這些 bug 不僅難以定位,甚至難以被覺察到。

很容易想到造成這種問題的簡單案例。例如,以下代碼在 items 為一個序列(sequence)時可以良好地運行,但是如果調(diào)用者將 item 重構(gòu)為一個可消耗的迭代器,則代碼會悄悄地產(chǎn)生縮短的、不匹配的結(jié)果:

def apply_calculations(items): transformed = transform(items) for i, t in zip(items, transformed): yield calculate(i, t)

zip 還有幾種常見用法。慣用的技巧性用法特別容易出問題,因為它們經(jīng)常被不完全了解代碼工作方式的用戶使用。下面是一個示例,解包到 zip 中以轉(zhuǎn)化成嵌套的可迭代對象:

>>> x = [[1, 2, 3], ['one' 'two' 'three']]>>> xt = list(zip(*x))

另一個例子是將數(shù)據(jù)“分塊”成大小相等的組:

>>> n = 3>>> x = range(n ** 2),>>> xn = list(zip(*[iter(x)] * n))

在第一個例子中,非矩形數(shù)據(jù)通常會導(dǎo)致邏輯錯誤。在第二個例子中,長度不是 n 的倍數(shù)的數(shù)據(jù)通常也是錯誤。因為這兩個習慣用法都會悄悄地忽略不匹配的尾部元素。

最有說服力的例子來自使用了 zip 的標準庫ast ,它在 literal_eval 里產(chǎn)生過一個 bug,會直接丟棄不匹配的節(jié)點:

>>> from ast import Constant, Dict, literal_eval>>> nasty_dict = Dict(keys=[Constant(None)], values=[])>>> literal_eval(nasty_dict) # Like eval('{None: }'){}

實際上,筆者已經(jīng)在 Python 的標準庫和工具中找出了許多調(diào)用點, 立即在這些位置啟用此新特性是恰當?shù)摹?/p>

基本原理

一些評論者聲稱:布爾開關(guān)常量是一種“代碼壞氣味(code-smell)”,或者與 Python 的設(shè)計哲學(xué)背道而馳。

但是,Python 當前在內(nèi)置函數(shù)上有幾個布爾關(guān)鍵字參數(shù)的用法,它們通常使用編譯期常量來調(diào)用:

compile(..., dont_inherit=True) open(..., closefd=False) print(..., flush=True) sorted(..., reverse=True)

標準庫中還有許多類似用法。

這個新參數(shù)的想法和名稱最初是由 Ram Rachum 提出的。該議題收到了 100 多個回復(fù),而候選的“equal”也獲得了相近的支持數(shù)。

筆者對它們沒有很強烈的偏好,盡管“equal equals” 讀起來有點尷尬。它還可能(錯誤地)暗示了 zip 的對象是相等的:

>>> z = zip([2.0, 4.0, 6.0], [2, 4, 8], equal=True)

規(guī)范

當用關(guān)鍵字參數(shù) strict=True 調(diào)用內(nèi)置類 zip 時,如果參數(shù)的長度不同,則生成的迭代器會引發(fā) ValueError。這個異常就發(fā)生在迭代器正常停止迭代的地方。

向上兼容

此項更改是完全向上兼容的。當前的 zip 不接受關(guān)鍵字參數(shù),默認省略 strict 的“非嚴格”用法會保持不變。

參考實現(xiàn)

筆者設(shè)計了一個 C 實現(xiàn)。

用 Python 大致翻譯如下:

def zip(*iterables, strict=False): if not iterables: return iterators = tuple(iter(iterable) for iterable in iterables) try: while True: items = [] for iterator in iterators: items.append(next(iterator)) yield tuple(items) except StopIteration: if not strict: return if items: i = len(items) plural = ' ' if i == 1 else 's 1-' msg = f'zip() argument {i+1} is shorter than argument{plural}{i}' raise ValueError(msg) sentinel = object() for i, iterator in enumerate(iterators[1:], 1): if next(iterator, sentinel) is not sentinel: plural = ' ' if i == 1 else 's 1-' msg = f'zip() argument {i+1} is longer than argument{plural}{i}' raise ValueError(msg)

被拒絕的意見

(1)添加 itertools.zip_strict

這是 Python-Ideas 郵件列表上獲得最多支持的替代方案,因此值得在此處加以討論。它沒有任何嚴重的缺陷,如果本 PEP 被否絕,它是一個很好的替代。

雖然考慮到這一點,但是在 zip 中添加可選參數(shù)可以用較小的更改而更好地解決誘發(fā)此 PEP 的問題。

(2)依照先例

itertools 中有一個 zip_longest,這似乎讓人很有動機再添加一個 zip_strict。但是,zip_longest 在許多方面是一個更加復(fù)雜且特定的程序:它負責填寫缺失的值,但其它函數(shù)都不需要操心這種事。

如果 zip 和 zip_longest 同時放在 itertools 中,或者都作為內(nèi)置函數(shù),那么在相同的地方添加 zip_strict 就確實是一個更有效的論點。然而,新的“strict”用法在接口和行為方面,相比起 zip_longest,更接近于 zip 的概念,但又不足以成為內(nèi)置對象。考慮到這個原因,令 zip 就地擴展出一個新的選項,似乎是最自然的選擇。

(3)易用性

如果 zip 能夠防止此類 bug,那么用戶在調(diào)用的地方啟動檢查,就會變得非常簡單。與其編寫一套繁重的邏輯來處理,不如用這個新特性來直接檢查。

有人還認為,在標準庫中放一個新的函數(shù),相比在一個內(nèi)置函數(shù)上加關(guān)鍵字參數(shù),更“容易發(fā)現(xiàn)(discoverable)”。筆者不同意這一論斷。

(4)維護成本

盡管在提升易用性時,具體的實現(xiàn)是個次要問題,但重要的是要認識到,添加新的程序比修改原有程序復(fù)雜得多。與此 PEP 一起提供的 CPython 實現(xiàn)非常簡單,并且對 zip 的默認行為沒有顯著的性能影響,而在 itertools 中添加一個全新的程序?qū)⑿枰?/p> 復(fù)制 zip 的許多現(xiàn)有邏輯,zip_longest 就是這么干的。 大刀闊斧地重構(gòu) zip 或 zip_longest 或這兩者,以便共享一個公共的或者繼承性的實現(xiàn)(這可能會影響性能)。

(5)添加多個“模式”以供切換

如果預(yù)期有三個或更多模式(mode),這個建議才會比二元標志更有意義。最顯而易見的三種模式是:“最短的”(當前 zip 的行為),“嚴格的”(本 PEP 提議的行為)和“最長的”(itertools.zip_longest 的行為)。

但是,除了當前的默認值以及本提案的“strict”模式,似乎不需要再添加其它模式。最可能的是添加一個“最長的”模式,但這需要一個新的 fillvalue 參數(shù)(它對于前兩種模式都沒有意義),另外,itertools.zip_longest 已經(jīng)完美地處理了這種模式,若在 zip 中添加該模式,將會造成重復(fù)。目前尚不清楚哪一個是“顯而易見的”選擇:內(nèi)置 zip 上的 mode 參數(shù),還是已經(jīng)長期存在于 itertools 中的 zip_longest。

(6)給 zip 添加方法或者構(gòu)造函數(shù)

考慮以下兩個被提出來的做法:

>>> zm = zip(*iters).strict()>>> zd = zip.strict(*iters)

尚不清楚哪個更好,或者哪個更差。如果 zip.strict 作為一個方法來實現(xiàn),則 zm 沒問題,但是 zd 會出現(xiàn)幾種令人困惑的情況:

返回不包裝在元組中的結(jié)果(如果 iters 僅包含一個元素,一個 zip 迭代器)。 參數(shù)類型錯誤時拋出 TypeError(如果 iters 只包含一個元素,不是一個 zip 迭代器)。 否則,參數(shù)數(shù)量不對時拋出 TypeError。

如果 zip.strict 是作為 classmethod 或 staticmethod 實現(xiàn),則 zd 將成功執(zhí)行,而 zm 將不產(chǎn)生任何結(jié)果(這正是我們最初要避免的問題)。

本提案還面臨著更為復(fù)雜的問題,因為 CPython 中 zip 內(nèi)置類的實現(xiàn)細節(jié)是未文檔化的。這意味著若選擇以上的某種行為,當前的實現(xiàn)就會被“鎖定”(或至少要求對其進行仿真)。

(7)變更 zip 的默認行為

zip 的默認行為沒有什么“錯” ,因為在許多情況下,這確實是正確處理大小不等的輸入的方法。例如,在處理無限迭代器時,它非常有用。

itertools.zip_longest 已經(jīng)用在仍然需要“額外”尾端數(shù)據(jù)的情況。

(8)使用回調(diào)來處理剩余對象

盡管基本上可以執(zhí)行用戶需要的任何操作,但此解決方案在處理常見問題時(例如舍棄不匹配的長度),變得不必要的復(fù)雜且不直觀。

(9)引發(fā)一個 AssertionError

沒有內(nèi)置函數(shù)或內(nèi)置類的 API 會引發(fā) AssertionError。此外,官方文檔 這么寫的(它的全部):

Raised when an assert statement fails.

由于此功能與 Python 的 assert 語句無關(guān),因此不應(yīng)該引發(fā) AssertionError。用戶若希望在優(yōu)化模式下禁用檢查(像一個 assert 語句),可以改用 strict = __debug__。

(10)在 map 上添加類似的特性

本 PEP 不建議對 map 作任何更改,因為很少使用帶有多個可迭代參數(shù)的map。但是,本 PEP 的裁定可作為將來討論類似特性的先例(應(yīng)該出現(xiàn))。

如果本 PEP 被拒絕,則 map 的那種特性實際上也不值得追求。如果通過了,則對 map 的更改不需要新的 PEP(盡管像所有提案一樣,都應(yīng)仔細考慮其有用性)。為了保持一致性,它應(yīng)遵循此處討論的跟 zip 相同的 API 和語義。

(11)什么也不做

此建議可能最沒有吸引力。

悄悄地將數(shù)據(jù)截斷是一種特別令人討厭的 bug,而手寫一個健壯的解決方案卻并非易事。Python 自己的標準庫(前文提到的 ast)是有現(xiàn)實意義的反例,很容易就陷入本 PEP 試圖避免的那種陷阱。

推薦閱讀:

1、PEP中文翻譯計劃 (https://github.com/chinesehuazhou/peps-cn)

2、學(xué)習 Python,怎能不懂點PEP呢? (https://mp.weixin.qq.com/s/oRoBxZ2-IyuPOf_MWyKZyw)

總結(jié)

到此這篇關(guān)于Python 3.10 的首個 PEP 誕生,內(nèi)置類型 zip() 迎來新特性的文章就介紹到這了,更多相關(guān)Python 3.10 內(nèi)置類型 zip() 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美午夜不卡影院在线观看完整版免费| 激情婷婷欧美| 日韩av不卡在线观看| 精品一区二区三区在线观看视频 | 久久国产日韩| 久久av一区二区三区| 国产精品亚洲综合久久| 激情综合激情| 久久久久国产精品一区三寸 | 日韩理论片av| 欧美一区网站| 国产精品欧美三级在线观看| 一本一道久久a久久| 成人黄色av| 成人片免费看| 久久精品国产久精国产| 蜜臀久久99精品久久久画质超高清| 精品精品国产三级a∨在线| 国产伦乱精品| 欧美精品三级在线| 青青草伊人久久| 日韩精品一区二区三区免费观看| 欧美精品资源| 91免费精品| 综合色一区二区| 亚洲一区导航| 色偷偷偷在线视频播放| 精品国产午夜| 9999国产精品| 亚洲大全视频| 久久午夜影视| 亚洲v天堂v手机在线| 亚洲精品伊人| 国产伦乱精品| 精品一区不卡| 国模大尺度视频一区二区| 亚洲精品高潮| 日韩精品国产精品| 国产精品三级| 欧美日韩精品在线一区| 99视频+国产日韩欧美| 99热精品在线| 青草久久视频| 日韩和的一区二在线| 在线亚洲自拍| 国产乱人伦丫前精品视频| 国产图片一区| 久久天堂影院| 亚洲第一区色| 精品入口麻豆88视频| 美女久久久精品| 国产99精品一区| 日本h片久久| 99国产精品免费视频观看| 天堂俺去俺来也www久久婷婷| 日韩欧美字幕| 五月婷婷亚洲| 在线精品一区| 日本亚洲欧美天堂免费| 国产日韩在线观看视频| 国产亚洲一区| 久久国产主播| 97久久中文字幕| 国产欧美另类| 国产精品亚洲综合久久| 亚洲一区资源| 蜜桃视频第一区免费观看| 99国产精品| 欧美激情久久久久久久久久久| se01亚洲视频| 亚洲欧美日本国产专区一区| 麻豆高清免费国产一区| 国产一区二区三区不卡视频网站 | 日韩一区精品视频| 欧美不卡在线| 天堂网av成人| 精精国产xxxx视频在线播放| 国产亚洲欧美日韩在线观看一区二区 | 黄色在线网站噜噜噜| 日本欧美不卡| 日本亚洲欧美天堂免费| 国产精品试看| 久久婷婷久久| 亚洲精品88| 日韩av一级片| 蜜臀国产一区二区三区在线播放| 亚洲香蕉视频| 国产欧美日韩一区二区三区在线| 蜜臀久久99精品久久一区二区| 日韩精品三区四区| 夜久久久久久| 久久精品国语| 久久夜色精品| 日韩亚洲精品在线观看| 亚洲精品观看| 午夜国产精品视频免费体验区| 国产精品久久久久久久久久久久久久久| 国产va免费精品观看精品视频| 中文字幕在线高清| 国产精品91一区二区三区| 免费一级片91| 国产精品成人3p一区二区三区| 久久精品资源| 91精品国产乱码久久久久久久| 国产欧美大片| 欧美一区二区三区久久| 日韩视频一区二区三区在线播放免费观看| 国产欧美亚洲精品a| 国产麻豆精品久久| 午夜久久免费观看| 久久国产日本精品| 天堂√8在线中文| 在线日韩一区| 蜜臀av在线播放一区二区三区| 亚洲欧美日韩综合国产aⅴ| 欧美在线网站| 亚洲人亚洲人色久| 亚洲免费福利一区| 国产精品中文字幕制服诱惑| 国产精品久久久一区二区| 欧美极品一区二区三区| 国产精品日韩精品在线播放| 欧美国产中文高清| 国产精品国产一区| 国产专区精品| av亚洲在线观看| 免费日韩精品中文字幕视频在线| 中国女人久久久| 欧美日韩一区二区三区四区在线观看| 亚洲制服少妇| 久久电影一区| 蜜桃视频一区二区| 亚洲另类av| 亚洲欧洲美洲国产香蕉| 日欧美一区二区| 涩涩涩久久久成人精品| 欧美一区二区三区免费看| 91亚洲精品在看在线观看高清| 日韩va亚洲va欧美va久久| 免费一级片91| 日韩欧美中文在线观看| 欧美亚洲专区| 福利视频一区| 日本国产精品| 国产视频一区在线观看一区免费| 一区二区91| 久久99高清| 99精品综合| 亚洲欧洲专区| 日韩**一区毛片| 精品国产a一区二区三区v免费| 国产精品久久久久久久久久白浆| 成人黄色av| 国产探花一区在线观看| 久久超碰99| 亚洲少妇在线| 欧美aa在线观看| 免费在线观看日韩欧美| 裤袜国产欧美精品一区| 中文字幕日韩高清在线| 久久电影tv| 国产激情综合| 亚洲ww精品| 免费在线小视频| 青青草91视频| 99久久亚洲精品蜜臀| 国产精品第一国产精品| 男女男精品网站| 五月综合激情| 麻豆国产精品视频| 免费在线成人网| 久久久久久久久久久妇女| 麻豆精品一区二区综合av| 亚洲精品自拍| 性一交一乱一区二区洋洋av| 久久99国产精品视频| 久热综合在线亚洲精品| 国产一区久久| 久久久久午夜电影| 日韩在线二区| 婷婷成人综合| 亚洲成人精品| 午夜精品成人av| 日本久久黄色| 日韩精品午夜视频| 91九色综合| 国产情侣一区| 久久中文字幕导航| 精品国产亚洲日本| 91精品国产自产观看在线| 亚洲精品无吗| 日韩精品免费视频人成| 国产精品一区高清| 国产精品欧美三级在线观看| 国产一区二区三区不卡视频网站 | 秋霞影院一区二区三区| 精品久久久久中文字幕小说| 亚洲精品美女91| 中文字幕免费一区二区| 人人爱人人干婷婷丁香亚洲|