聊聊 print 的前世今生

来自:Python猫(微信号:python_cat),作者:豌豆花下猫

语言的相似表述,都表明着一件事,那就是打印操作很重要,而且我们对它的要求还很复杂多样。

Python 中的 print 语句能发展成今天的 print() 函数,已经非常完善了。

不过,需求是无止境的,作为最常用的调试手段,print() 还达不到十全十美。它的好处是简单直白、容易上手,但缺点则是功能单一、效率较低,在需要定制格式的频繁使用场景下,不堪大用。

这在不同编程语言中是通病,因此大家都默契地提供了用于调试的日志模块,例如 Java 的 log4j,C++ 的 log4cxx,当然还有 Python 的 logging。

日志模块 logging 可以说是对 print() 函数的替代式升级,主要优点是更加灵活高效,例如可以设置不同的日志等级、配置多样的格式化信息、甚至可以输出日志到远程服务器上。

当然,日志模块只是一种解决方案,也并不是最完美的。

在 Python 中还有一些模块可以用于调试,例如最主流的 pdb,它可以设置断点、分步调试、查看栈片段、动态调值等,用得好,有奇效。主流的 IDE 工具也都提供了一些调试手段,相比于简单的 print(),它们具有降维打击的优势。

今年 4 月,Github 上开源了一个专用于调试程序的库,名叫 PySnooper ,短短两个月,它就收获了近 12K 个关注。这个三方库的口号是“Never use print for debugging again”,其目标就是在调试代码时完全替代 print。

这个库的用法非常简单,只需一行代码,就可以实现对整个函数的监听,做到记录每一行的执行时间、记录每个变量的赋值等等,而且还可以使用“with”语句,监听部分的代码块,或者使用“watch”命令,专门监听特定的变量值。

这个库强大而惊艳,除了上述作用,它还能监听指定格式开头的代码,能在多线程中监听线程,甚至支持用户自定义的监听规则。难怪它一经面世,就好评如潮,人人奔走相告。

snoop 这个单词很有意思,它指的是嗅探、窥探和监听。首字母大写的 Snoop ,译作史努比,则是一只被很多人喜爱的漫画小狗。所以这个 PySnooper 库就令我不由地产生了一种联想:它是一只嗅觉异常敏锐的小狗,明白无误地为你执行各种监听任务。

史努比小狗(图片来源于网络)

(七)

最后,我们可以来回顾一下 print 的发展历史了,有两条线索,一条是它自身发展的明线,另一条是它的挑战者们的暗线。

先看明线吧,早期版本的 print 语句带有 C 和 Shell 的影子,它是个应用程序级的 statement,使用十几年间,有过一些改进的尝试,例如 PEP-214 和 PEP-259;到了 2009 年的大版本 3.0,Python 把 print 语句改成了 print() 函数,使它成为了众多内置函数的一员,随后在 3.3 版本,又对它做了一次功能增强,至此,它完成了自己的华丽蜕变,占据了稳固的一席之地。

至于暗线,print 的竞争对手们可谓众多,像传统的日志模块 logging、调试模块 pdb、以及主流 IDE 的调试功能,等等,如今还有一位后起之秀 PySnooper,无不瞄准了 print 的位置,摩拳擦掌,虎视眈眈。

print 一词最早应该跟纸带相关,用途和需求场景都很少,如今的计算机世界已经不可同日而语,所以才促进了 print 自身的发展,也刺激了众多对手们的崛起。

print 代表了一种诉求/思想:输出计算结果、记录程序过程、监察对象变化,然后用于查看、分析、调试、展示等等。

明线上的发展,就是继承了它的名字,壮大 print;暗线上的发展,则是继承了它的思想,为了实现目的,各施手段,百花齐放。

print 当然不是 Python 所特有的,这明暗两线的发展也同理,如果你把视野放到任何一个经得起时间考验的语言上,必然也会看到相似的发展历程与竞争故事。

最后,如果你想了解更多内容,可以查看:

https://docs.python.org/3/library/functions.html#print

学习Python,怎能不懂点PEP呢?

https://www.python.org/dev/peps/pep-0214

https://www.python.org/dev/peps/pep-0259

为什么 Python 3 把 print 改为函数?

https://github.com/cool-RR/PySnooper

推荐↓↓↓
Python编程
上一篇:当谈论迭代器时,我谈些什么? 下一篇:10 行 Python 代码,批量压缩图片 500 张,简直太强大了