+-
让Python之父点赞的Python静态类型检查器:Mypy

9月27日,Mypy发布了新的版本0.730,新增了彩色的、更漂亮的提示输出,Python之父得知后在Twitter上为该团队手动转发+点赞。


那么Mypy是什么呢?为何Python之父如此关心?


Mypy是Python的静态类型检查器,也就是检查Python各类变量是否类型正确的一个工具。


等等,等等,Python不是动态语言吗?动态语言也可以做静态类型检查吗?有必要做静态类型检查吗?


我们先回答是否有必要的问题。直接的答案就是有必要。具体来讲,Python之前一直有一个被大厂诟病,进而导致大厂项目很少采用Python的一个问题,就是没有静态类型检查。静态类型检查确实在编码时让程序员多敲了不少键盘,但是它对于预防“愚蠢错误”是有很好的效果的。大厂项目往往代码数量多,逻辑复杂,参与项目人员水平参差不齐,想指望参与项目的程序员都对全部代码有100%的理解是不太可能的。在这种情况下,如果没有静态类型检查,写出的项目必定漏洞百出且不易排查。也因为大项目很少采用,Python在早期便得到了一个“脚本语言”的称号,寓意就是只能用来写脚本,不堪大用。但是Python创建的初衷可不是只为了写脚本,它是希望成为全功能、全平台的通用型语言(当然这个目标还没有达到,至少客户端很少用Python编写)。所以“更好地支持大型项目”这个目标,就势在必行了。添加静态类型检查,也就是顺理成章的事情了。


那么动态语言真的能够做静态类型检查么?那跟静态语言还有什么区别?


以前是不能的,现在可以了。从Python3.6开始,Python增加了类型注释的功能,就是允许为Python变量、参数、返回值标注类型。有了这些标注,静态类型检查的功能就可以完成了。


同时,这里虽然能够标注类型了,但并不是强制的,你可以自由选择标注还是不标;即便是标注了的部分,也不是强制检查的,也就是说这些标注即便写错了,对于运行也是没有影响的。这种类型检查相比于静态语言还是有本质区别的,毕竟静态语言的类型检查是极度强制的(强制标注+强制检查)。


Python的这种设计,给开发者带来了极大的便利。如果你在编写一个逻辑简单的项目,可以完全不标注类型,以最快的速度完成任务。如果你的项目很成功,代码量和复杂度快速上升,你可以在复杂的地方添加类型检查,避免掉一些低级错误。这样,Python就兼顾了静态语言和动态语言的好处,向“通用语言”又迈进了一步。小编窃以为Python这种设计慢慢会变成动态语言的标配。


标注了类型,谁来检查类型呢?总不能用眼睛看吧?


当然不是,有了标注,自然会有对应的检查工具。实际上社区中做类型检查的工具还是很多的,但是既然Python之父都点赞Mypy了,如果你没有特别熟悉的检查工具,不如就试试Mypy好了。


最后,留下Mypy的项目地址,供有兴趣的同学深入研究:

  • http://mypy-lang.org/