您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python 3.3 改進代碼中的異常處理的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python 3.3 改進代碼中的異常處理的方法”吧!
yield
關(guān)鍵字使 Python 更加強大??梢灶A(yù)見的是,人們都開始使用它來創(chuàng)建整個迭代器的生態(tài)系統(tǒng)。itertools 模塊和 more-itertools PyPI 包就是其中兩個例子。
有時,一個新的生成器會想要使用一個現(xiàn)有的生成器。作為一個簡單的(盡管有點故意設(shè)計)的例子,設(shè)想你想枚舉所有的自然數(shù)對。
一種方法是按照“自然數(shù)對的和,自然數(shù)對的第一項”的順序生成所有的自然數(shù)對。用 yield from
來實現(xiàn)這個方法是很自然的。
yield from <x>
關(guān)鍵字是以下的簡稱:
for item in x: yield item
import itertools def pairs(): for n in itertools.count(): yield from ((i, n-i) for i in range(n+1))
list(itertools.islice(pairs(), 6))
[(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0)]
假設(shè)有一個叫 Parasol 的虛構(gòu)公司,它制造了一堆東西。它的大部分內(nèi)部軟件都是用 Python 編寫的。雖然 Parasol 已經(jīng)開源了它的一些代碼,但其中一些代碼對于開源來說過于專有或?qū)I(yè)。
該公司使用內(nèi)部 DevPI 服務(wù)器來管理內(nèi)部軟件包。對于 Parasol 的每個 Python 程序員來說,在 PyPI 上找一個未使用的名字是沒有意義的,所以所有的內(nèi)部包都被稱為 parasol.<business division>.<project>
。遵守最佳實踐,開發(fā)人員希望包的名字能反映出這個命名系統(tǒng)。
這一點很重要!如果 parasol.accounting.numeric_tricks
包安裝了一個名為 numeric_tricks
的頂層模塊,這意味著依賴這個包的人將無法使用名為 numeric_tricks
的 PyPI 包,不管它寫的有多好。
然而,這給開發(fā)者留下了一個兩難的選擇:哪個包擁有 parasol/__init__.py
文件?從 Python 3.3 開始,最好的解決辦法是把 parasol
,可能還有 parasol.accounting
,變成沒有 __init__.py
文件的 命名空間包。
有時,在從異常中恢復(fù)的過程中出現(xiàn)的異常是一個問題,有上下文來跟蹤它是很有用的。然而,有時卻不是這樣:異常已經(jīng)被處理了,而新的情況是一個不同的錯誤狀況。
例如,想象一下,在字典中查找一個鍵失敗后,如果不能分析它,則希望失敗并返回 ValueError()
。
import time def expensive_analysis(data): time.sleep(10) if data[0:1] == ">": return data[1:] return None
這個函數(shù)需要很長的時間,所以當你使用它時,想要對結(jié)果進行緩存:
cache = {} def last_letter_analyzed(data): try: analyzed = cache[data] except KeyError: analyzed = expensive_analysis(data) if analyzed is None: raise ValueError("invalid data", data) cached[data] = analyzed return analyzed[-1]
不幸的是,當出現(xiàn)緩存沒有命中時,回溯看起來很難看:
last_letter_analyzed("stuff")
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-16-a525ae35267b> in last_letter_analyzed(data) 4 try: ----> 5 analyzed = cache[data] 6 except KeyError: KeyError: 'stuff'
在處理上述異常的過程中,發(fā)生了另一個異常:
ValueError Traceback (most recent call last) <ipython-input-17-40dab921f9a9> in <module> ----> 1 last_letter_analyzed("stuff") <ipython-input-16-a525ae35267b> in last_letter_analyzed(data) 7 analyzed = expensive_analysis(data) 8 if analyzed is None: ----> 9 raise ValueError("invalid data", data) 10 cached[data] = analyzed 11 return analyzed[-1] ValueError: ('invalid data', 'stuff')
如果你使用 raise ... from None
,你可以得到更多可讀的回溯:
def last_letter_analyzed(data): try: analyzed = cache[data] except KeyError: analyzed = expensive_analysis(data) if analyzed is None: raise ValueError("invalid data", data) from None cached[data] = analyzed return analyzed[-1]
last_letter_analyzed("stuff")
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-21-40dab921f9a9> in <module> ----> 1 last_letter_analyzed("stuff") <ipython-input-20-5691e33edfbc> in last_letter_analyzed(data) 5 analyzed = expensive_analysis(data) 6 if analyzed is None: ----> 7 raise ValueError("invalid data", data) from None 8 cached[data] = analyzed 9 return analyzed[-1] ValueError: ('invalid data', 'stuff')
到此,相信大家對“Python 3.3 改進代碼中的異常處理的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。