动态类型一时爽,代码重构火葬场?

题图:Photo by Timo Wagner on Unsplash

江湖有言:“动态类型一时爽,代码重构火葬场”,听起来有点耸人听闻,但也没有想象中的那么严重,因为 Python 在大型项目的应用实在太多。Python作为动态语言,代码简洁、灵活,抛开运行效率不说,但存在的一些问题也是事实,例如:

1、IDE的智能提示比较鸡肋,举个例子,字符串有个 startswith 方法,你很容易忽略中间那个“s”,如果么有 IDE 的帮助,不得不去查个文档。(其实现在的PyCharm 已经非常智能了,即使没有类型声明。)

2、大部分错误只有在程序运行的时候才能被发现,编译过程中只能发现简单的语法错误。

3、接口调用全靠文档注释说明,虽然我们可以使用 docstring,但是代码更新之后,你的 docstring 可能就没有同步更新。

这些问题在大型项目,特别是多人合作的项目上显得更为突出。所以遵循代码规范、Code Review 就变得尤为重要,如果能从语法层面上去规范代码无疑是最省成本的,所以在 Python3.5,也就是 PEP484 中就有了类型提示(Type Hints)。定义函数时,可以你指定函数的返回值类型、参数的类型。

以前定义一个函数可以接收任何类型的数据:

程序运行前,不会有任何错误提示,虽然我们知道字符串和数字是不支持“+”操作的。

在 Python3.5 中,用 Type Hint 写法是这样的:

上面就是静态类型的写法,多了 「: str」与 「-> str」,前者用来说明 name 的类型,后者指函数返回值的类型,我们在写代码的过程中IDE也能提示我们写得不对:

除了 IDE 之外,我们还有更强大的静态类型检查工具,叫 mypy,这个工具也是由 Python 之父 Guido 亲自操刀实现的静态类型检查工具。

有了类型提示,Python在代码调用、重构、甚至是静态分析等方面有了更好的效果,不但减轻了开发时自行进行型态检查的负担,更重要的是,由于有了型态上的提示,让过去 Python 整合开发工具上做不好的各种智能提示、重构等功能有了统一的参考标准。

某种意义上类型提示只是一种辅助功能,虽然我们加了数据类型提示,但是对于 Python 解释器来说,它会直接忽略掉类型提示信息,哪怕类型有误也不会阻止程序的运行。

而对于变量的类型声明,在 PEP484 中可以通过类型注释来说明,就是以注释的方式来说明变量的类型,例如:

在 Python3.6,也就是 PEP526 的提案中,针对变量注解做了进一步优化,将类型的声明作为了语法的一部分,这样比起注释可读性更强,例如:

运行mypy

拥有了强大的类型提示之后,你还敢说重构代码是火葬场吗?不过我反倒觉得动态语言变得越来越臃肿起来,例如:

这让一门原本简洁优雅的语言跟Java一样臃肿了,好在类型提示在Python中只是一种可选操作,而且对解释器来说完全是不可见的。而且这种写法也不是Python 的主流做法,大家可以去看看主流框架的源码,很少用这种特性。

虽然 Java 是一门很成功的语言(而且也开始加入动态类型等特性),但我更喜欢 Python 的理由是它给了开发者最大的自由。至于说代码好不好维护,真的跟人有关,毕竟大家都是成年人!( We are all consenting adults)

本文可接受反驳

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181107B1LWED00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券