Python實(shí)用魔法系列(一)
我們知道任何一門語(yǔ)言都有自己獨(dú)特的黑魔法债蓝,或是語(yǔ)言深層特性壳鹤,或是讓人開(kāi)心的語(yǔ)法糖,有些不適合業(yè)務(wù)代碼和常用腳本惦蚊,比如元編程等等器虾,但也有些簡(jiǎn)單實(shí)用的魔法,能讓苦短人生再短一點(diǎn)蹦锋,在這分享記錄下
defaultdict
這個(gè)相當(dāng)常見(jiàn)兆沙,帶默認(rèn)值的字典,做統(tǒng)計(jì)計(jì)數(shù)時(shí)相當(dāng)好用莉掂,其實(shí)更方便的是利用匿名函數(shù)處理多層數(shù)據(jù)葛圃,比如按城市統(tǒng)計(jì)人名次數(shù)
from collections import defaultdict
counts = defaultdict(lambda: defaultdict(int))
for city, name in peples:
counts[city][name] += 1
contextlib
我們知道with
關(guān)鍵字是python與眾不同的語(yǔ)法糖之一,恰當(dāng)?shù)氖褂媚茏尨a簡(jiǎn)潔明了,其中官方庫(kù)contextlib包下有很多with
控制塊的實(shí)用工具库正,用過(guò)就回不去了曲楚,舉幾個(gè)一克斯然跑:
- suppress
這是官方的解釋:Context manager to suppress specified exceptions
,使用場(chǎng)景很常見(jiàn)褥符,比如說(shuō)我們需要處理一堆商品龙誊,但是可能會(huì)有些未知異常,可能跑到一半掛了喷楣,除了跑一遍修一遍趟大,我們可以用以下代碼:
for product in products:
with contextlib.suppress(Exception):
handle(i)
- contextmanager
contextmanager
提供了一個(gè)簡(jiǎn)單的方式來(lái)創(chuàng)建上下文管理器,拿上面的例子來(lái)說(shuō)铣焊,直接使用官方的suppress
能讓我們遍歷完所有商品逊朽,但是這種做法會(huì)隱藏所有異常,很可能90%的商品處理過(guò)程都出了異常曲伊,但是我們可能不知情叽讳,這時(shí)候可以自定義我們的suppress
來(lái)進(jìn)行異常捕獲輸出:
from contextlib import contextmanager
@contextmanager
def mysuppress():
try:
print("context start")
yield
except Exception as e:
loger.exception(e)
finally:
print("context end")
除了for循環(huán)代碼,也可以使用在業(yè)務(wù)流程里坟募,比如將某個(gè)不太重要但容易出錯(cuò)步驟包在我們的suppress
里岛蚤,使我們的代碼更有魯棒性