背景

应该是在 Python 这条道上混的久了,总能不经意间看到一些水面之下的东西。就比如 3.14 版本的 operator 模块增加了下面这样的两个函数。change-log 是这样写的

Two new functions operator.is_none and operator.is_not_none have been added,
such that operator.is_none(obj) is equivalent to obj is None
and operator.is_not_none(obj) is equivalent to obj is not None.
(Contributed by Raymond Hettinger and Nico Mexis in gh-115808.)

实现如下

def is_none(a):
"Same as a is None."
return a is None

def is_not_none(a):
"Same as a is not None."
return a is not None

新手一定会认为,就这都能上 change-log 太水了。然而对于我这种几年前自己亲自实现过这类型函数的人来说,太亲切了。

讲一下 None 以前是怎么坑的我

以前我们有一个程序去监控 MySQL 的延时,当延时大于 100 秒的时候打告警电话,伪代码是这样的。

status = get_replication_lag(host, port, user, password)
if status.seconds_behind_master > 100:
call_dba()

这段逻辑确实是可以发现延时,但是数据备机的复制异常了,这个时候 MySQL 返回的 seconds_behind_master 会是 None ,当我们执行 None > 100 的检查时这段程序就会报异常。

None 值的判断对于程序鲁棒性还是非常重要的

官方这次更新的用意

假设我们有一个需求就是要把列表中的 None 值过虑出来。一般来说一个列表推导就行了,按面向过程的写法应该是这样的。

numbers = [1, 2, None, 3, 5]
numbers_exclude_none = [num for num in numbers if num is not None]

面向过程确实不太好理解语义,如果我们要是用函数式编程,逻辑就一目了然了。

def is_not_none(a):
return a is not None

numbers_exclude_none = filter(is_not_none, numbers)

现在我们可以看到 is_not_none 的用处了。也就说如果你也使用函数式编程,你大概率写过一堆的真假值测试函数,官方的这次更新就只把常用的比较函数,实现在标准库里,一来大家都方便,二来实现上也统一,还是有一些用的。

结论

社区在函数式编程方式不只是搭了个架子,一些边边角角的工具还是有在增强的。

以上是今天的分享,最后提醒一下:Python 潮流周刊限时特惠,原价 128 元/年,限时仅需 99 元/年,欲购从速啦!

如果你正在寻找优质的Python文章和项目,我必须向你推荐Python潮流周刊

它精选全网的优秀文章、教程、开源项目、软件工具、播客、视频、热门话题等丰富内容,让你紧跟技术最前沿,获取最新的第一手学习资料!

欢迎点击下方图片,了解这份全世界知识密度最高、知识广度最大的 Python 技术周刊。