My blogger

My way, my world

0%

python实用魔法

任何一门语言都有自己独特的“黑魔法”,或是语言特性,或是让人开心的语法糖,其中python世界有些简单实用的魔法,能让苦短人生再短一点,在这分享记录下

defaultdict

这个相当常见,带默认值的字典,做统计计数时相当好用,其实更方便的是利用匿名函数处理多层数据,比如按城市统计人名次数

1
2
3
4
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,使用场景很常见,比如说我们需要处理一堆商品,但是可能会有些未知异常,可能跑到一半挂了,除了跑一遍修一遍,我们可以用以下代码:

1
2
3
for product in products:
with contextlib.suppress(Exception):
handle(product)
  • contextmanager

contextmanager提供了一个简单的方式来创建上下文管理器,拿上面的例子来说,直接使用官方的suppress能让我们遍历完所有商品,但是这种做法会隐藏所有异常,很可能90%的商品处理过程都出了异常,但是我们可能不知情,这时候可以自定义我们的suppress来进行异常捕获输出:

1
2
3
4
5
6
7
8
9
10
11
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里,使我们的代码更有鲁棒性