Python3.3改進(jìn)代碼中的異常處理的方法

本篇內(nèi)容主要講解“Python 3.3 改進(jìn)代碼中的異常處理的方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python 3.3 改進(jìn)代碼中的異常處理的方法”吧!

創(chuàng)新互聯(lián)專(zhuān)注于網(wǎng)站建設(shè)|網(wǎng)站建設(shè)維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋成都玻璃隔斷等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷(xiāo)售的產(chǎn)品,結(jié)合品牌形象的塑造,量身開(kāi)發(fā)品質(zhì)網(wǎng)站。

yield from

yield 關(guān)鍵字使 Python 更加強(qiáng)大。可以預(yù)見(jiàn)的是,人們都開(kāi)始使用它來(lái)創(chuàng)建整個(gè)迭代器的生態(tài)系統(tǒng)。itertools 模塊和 more-itertools PyPI 包就是其中兩個(gè)例子。

有時(shí),一個(gè)新的生成器會(huì)想要使用一個(gè)現(xiàn)有的生成器。作為一個(gè)簡(jiǎn)單的(盡管有點(diǎn)故意設(shè)計(jì))的例子,設(shè)想你想枚舉所有的自然數(shù)對(duì)。

一種方法是按照“自然數(shù)對(duì)的和,自然數(shù)對(duì)的第一項(xiàng)”的順序生成所有的自然數(shù)對(duì)。用 yield from 來(lái)實(shí)現(xiàn)這個(gè)方法是很自然的。

yield from <x> 關(guān)鍵字是以下的簡(jiǎ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è)有一個(gè)叫 Parasol 的虛構(gòu)公司,它制造了一堆東西。它的大部分內(nèi)部軟件都是用 Python 編寫(xiě)的。雖然 Parasol 已經(jīng)開(kāi)源了它的一些代碼,但其中一些代碼對(duì)于開(kāi)源來(lái)說(shuō)過(guò)于專(zhuān)有或?qū)I(yè)。

該公司使用內(nèi)部 DevPI 服務(wù)器來(lái)管理內(nèi)部軟件包。對(duì)于 Parasol 的每個(gè) Python 程序員來(lái)說(shuō),在 PyPI 上找一個(gè)未使用的名字是沒(méi)有意義的,所以所有的內(nèi)部包都被稱為 parasol.<business division>.<project>。遵守最佳實(shí)踐,開(kāi)發(fā)人員希望包的名字能反映出這個(gè)命名系統(tǒng)。

這一點(diǎn)很重要!如果 parasol.accounting.numeric_tricks 包安裝了一個(gè)名為 numeric_tricks 的頂層模塊,這意味著依賴這個(gè)包的人將無(wú)法使用名為 numeric_tricks 的 PyPI 包,不管它寫(xiě)的有多好。

然而,這給開(kāi)發(fā)者留下了一個(gè)兩難的選擇:哪個(gè)包擁有 parasol/__init__.py 文件?從 Python 3.3 開(kāi)始,最好的解決辦法是把 parasol,可能還有 parasol.accounting,變成沒(méi)有 __init__.py 文件的 命名空間包。

抑制異常的上下文

有時(shí),在從異常中恢復(fù)的過(guò)程中出現(xiàn)的異常是一個(gè)問(wèn)題,有上下文來(lái)跟蹤它是很有用的。然而,有時(shí)卻不是這樣:異常已經(jīng)被處理了,而新的情況是一個(gè)不同的錯(cuò)誤狀況。

例如,想象一下,在字典中查找一個(gè)鍵失敗后,如果不能分析它,則希望失敗并返回 ValueError()

import time def expensive_analysis(data):    time.sleep(10)    if data[0:1] == ">":        return data[1:]    return None

這個(gè)函數(shù)需要很長(zhǎng)的時(shí)間,所以當(dāng)你使用它時(shí),想要對(duì)結(jié)果進(jìn)行緩存:

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]

不幸的是,當(dāng)出現(xiàn)緩存沒(méi)有命中時(shí),回溯看起來(lái)很難看:

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'

在處理上述異常的過(guò)程中,發(fā)生了另一個(gè)異常:

    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')

到此,相信大家對(duì)“Python 3.3 改進(jìn)代碼中的異常處理的方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站題目:Python3.3改進(jìn)代碼中的異常處理的方法
轉(zhuǎn)載注明:http://muchs.cn/article22/gddcjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航服務(wù)器托管、Google、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司