Python实用魔法系列(一)
我们知道任何一门语言都有自己独特的黑魔法,或是语言深层特性,或是让人开心的语法糖,有些不适合业务代码和常用脚本,比如元编程等等,但也有些简单实用的魔法,能让苦短人生再短一点,在这分享记录下
defaultdict
这个相当常见,带默认值的字典,做统计计数时相当好用,其实更方便的是利用匿名函数处理多层数据,比如按城市统计人名次数
from collections import defaultdict
counts = defaultdict(lambda: defaultdict(int))
for city, name in peples:
counts[city][name] += 1
contextlib
我们知道with
关键字是python与众不同的语法糖之一,恰当的使用能让代码简洁明了,其中官方库contextlib包下有很多with
控制块的实用工具,用过就回不去了,举几个一克斯然跑:
- suppress
这是官方的解释:Context manager to suppress specified exceptions
,使用场景很常见,比如说我们需要处理一堆商品,但是可能会有些未知异常,可能跑到一半挂了,除了跑一遍修一遍,我们可以用以下代码:
for product in products:
with contextlib.suppress(Exception):
handle(i)
- contextmanager
contextmanager
提供了一个简单的方式来创建上下文管理器,拿上面的例子来说,直接使用官方的suppress
能让我们遍历完所有商品,但是这种做法会隐藏所有异常,很可能90%的商品处理过程都出了异常,但是我们可能不知情,这时候可以自定义我们的suppress
来进行异常捕获输出:
from contextlib import contextmanager
@contextmanager
def mysuppress():
try:
print("context start")
yield
except Exception as e:
loger.exception(e)
finally:
print("context end")
除了for循环代码,也可以使用在业务流程里,比如将某个不太重要但容易出错步骤包在我们的suppress
里,使我们的代码更有鲁棒性