成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 3.3 為改進代碼中的異常處理所做的工作

開發 后端
這是 Python 3.x 首發特性系列文章的第四篇。Python 3.3 于 2012 年首次發布,盡管它已經發布了很長時間,但它引入的許多特性都沒有得到充分利用,而且相當酷。

[[402478]]

探索異常處理和其他未被充分利用但仍然有用的 Python 特性。

這是 Python 3.x 首發特性系列文章的第四篇。Python 3.3 于 2012 年首次發布,盡管它已經發布了很長時間,但它引入的許多特性都沒有得到充分利用,而且相當酷。下面是其中的三個。

yield from

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

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

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

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

  1. for item in x:
  2.     yield item
  1. import itertools
  2.  
  3. def pairs():
  4. for n in itertools.count():
  5. yield from ((i, n-i) for i in range(n+1))
  1. list(itertools.islice(pairs(), 6))
  1. [(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()

  1. import time
  2.  
  3. def expensive_analysis(data):
  4.     time.sleep(10)
  5.     if data[0:1] == ">":
  6.         return data[1:]
  7.     return None

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

  1. cache = {}
  2.  
  3. def last_letter_analyzed(data):
  4.     try:
  5.         analyzed = cache[data]
  6.     except KeyError:
  7.         analyzed = expensive_analysis(data)
  8.         if analyzed is None:
  9.             raise ValueError("invalid data", data)
  10.         cached[data] = analyzed
  11.     return analyzed[-1]

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

  1. last_letter_analyzed("stuff")
  1. ---------------------------------------------------------------------------
  2.  
  3. KeyError Traceback (most recent call last)
  4.  
  5. <ipython-input-16-a525ae35267b> in last_letter_analyzed(data)
  6. 4 try:
  7. ----> 5 analyzed = cache[data]
  8. 6 except KeyError:
  9.  
  10.  
  11. KeyError: 'stuff'

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

  1. ValueError Traceback (most recent call last)
  2.  
  3. <ipython-input-17-40dab921f9a9> in <module>
  4. ----> 1 last_letter_analyzed("stuff")
  5.  
  6. <ipython-input-16-a525ae35267b> in last_letter_analyzed(data)
  7. 7 analyzed = expensive_analysis(data)
  8. 8 if analyzed is None:
  9. ----> 9 raise ValueError("invalid data", data)
  10. 10 cached[data] = analyzed
  11. 11 return analyzed[-1]
  12.  
  13.  
  14. ValueError: ('invalid data', 'stuff')

如果你使用 raise ... from None,你可以得到更多可讀的回溯:

  1. def last_letter_analyzed(data):
  2. try:
  3. analyzed = cache[data]
  4. except KeyError:
  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]
  1. last_letter_analyzed("stuff")
  1. ---------------------------------------------------------------------------
  2.  
  3. ValueError Traceback (most recent call last)
  4.  
  5. <ipython-input-21-40dab921f9a9> in <module>
  6. ----> 1 last_letter_analyzed("stuff")
  7.  
  8. <ipython-input-20-5691e33edfbc> in last_letter_analyzed(data)
  9. 5 analyzed = expensive_analysis(data)
  10. 6 if analyzed is None:
  11. ----> 7 raise ValueError("invalid data", data) from None
  12. 8 cached[data] = analyzed
  13. 9 return analyzed[-1]
  14.  
  15.  
  16. ValueError: ('invalid data', 'stuff')

歡迎來到 2012 年

盡管 Python 3.3 在十年前就已經發布了,但它的許多功能仍然很酷,而且沒有得到充分利用。如果你還沒有,就把它們添加到你的工具箱中吧。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2010-07-28 09:04:07

Flex2.0.1

2009-06-25 14:05:40

Java應用技巧

2020-07-02 22:42:18

Java異常編程

2013-04-07 10:01:26

Java異常處理

2009-01-05 09:14:17

.NETcatch性能損失

2024-06-28 10:29:18

異常處理Python

2010-03-09 14:10:13

Python循環語句

2010-06-22 10:26:08

Python

2017-06-02 10:25:26

Java異常處理

2009-03-16 16:08:09

PHP異常

2023-03-09 12:21:38

2025-02-10 09:49:00

2010-03-11 16:29:28

Visual Stud

2024-02-26 16:40:58

2012-04-18 16:42:03

PhoneGap

2024-05-28 14:45:00

2010-10-08 15:44:16

TFS2010Visual Stud

2013-04-01 09:39:06

JavaJava異常

2017-09-26 11:43:12

Java異常和處理

2024-04-16 12:18:05

編程異常處理錯誤返回
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清久久 | 九九热在线视频观看这里只有精品 | 国产在线观看福利 | 中文字幕视频在线观看 | 四虎成人在线播放 | 日韩三极 | 日韩欧美成人一区二区三区 | 一级片在线免费看 | www日日日 | 亚洲人成在线观看 | 日韩不卡三区 | 91亚洲精品在线 | 中文字幕av一区 | 999久久精品 | 国产精品成人在线播放 | 久久久91| 99亚洲 | 国产精品高潮呻吟久久aⅴ码 | 日韩成人在线观看 | 最新一级毛片 | 欧美性大战久久久久久久蜜臀 | 精精精精xxxx免费视频 | 色婷婷综合久久久中字幕精品久久 | 二区高清 | 精品欧美一区二区精品久久久 | 人人性人人性碰国产 | 成人亚洲视频 | 国产精品久久久久久久毛片 | 精品国产视频在线观看 | 国产欧美一区二区三区久久 | www.国产精品 | 欧美日韩久久 | 日本黄色一级片视频 | 亚洲福利在线视频 | 久草.com | 欧美日韩国产一区二区 | 久久中文网 | 久久免费精品视频 | 亚洲国产精品激情在线观看 | 国产精品成人久久久久 | 欧美日韩精品 |