亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python 3.3 改進代碼中的異常處理的方法

發布時間:2021-06-16 11:27:41 來源:億速云 閱讀:92 作者:chen 欄目:編程語言

本篇內容主要講解“Python 3.3 改進代碼中的異常處理的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python 3.3 改進代碼中的異常處理的方法”吧!

yield from

yield 關鍵字使 Python 更加強大。可以預見的是,人們都開始使用它來創建整個迭代器的生態系統。itertools 模塊和 more-itertools PyPI 包就是其中兩個例子。

有時,一個新的生成器會想要使用一個現有的生成器。作為一個簡單的(盡管有點故意設計)的例子,設想你想枚舉所有的自然數對。

一種方法是按照“自然數對的和,自然數對的第一項”的順序生成所有的自然數對。用 yield from 來實現這個方法是很自然的。

yield from <x> 關鍵字是以下的簡稱:

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

隱式命名空間包

假設有一個叫 Parasol 的虛構公司,它制造了一堆東西。它的大部分內部軟件都是用 Python 編寫的。雖然 Parasol 已經開源了它的一些代碼,但其中一些代碼對于開源來說過于專有或專業。

該公司使用內部 DevPI 服務器來管理內部軟件包。對于 Parasol 的每個 Python 程序員來說,在 PyPI 上找一個未使用的名字是沒有意義的,所以所有的內部包都被稱為 parasol.<business division>.<project>。遵守最佳實踐,開發人員希望包的名字能反映出這個命名系統。

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

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

抑制異常的上下文

有時,在從異常中恢復的過程中出現的異常是一個問題,有上下文來跟蹤它是很有用的。然而,有時卻不是這樣:異常已經被處理了,而新的情況是一個不同的錯誤狀況。

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

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

這個函數需要很長的時間,所以當你使用它時,想要對結果進行緩存:

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]

不幸的是,當出現緩存沒有命中時,回溯看起來很難看:

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'

在處理上述異常的過程中,發生了另一個異常:

    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 改進代碼中的異常處理的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金湖县| 疏勒县| 张家口市| 杭锦后旗| 贡觉县| 冀州市| 永川市| 江永县| 吴桥县| 渝北区| 张北县| 龙胜| 镇康县| 绥滨县| 洛南县| 五莲县| 布尔津县| 大丰市| 遂溪县| 容城县| 龙门县| 伊宁市| 同仁县| 尼勒克县| 离岛区| 定襄县| 和林格尔县| 迭部县| 巫溪县| 铅山县| 晋宁县| 堆龙德庆县| 洞口县| 克山县| 来安县| 汉沽区| 马公市| 安顺市| 荆州市| 苏尼特左旗| 蛟河市|