Python实用魔法系列(一)

1,042 阅读2分钟

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里,使我们的代码更有鲁棒性