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

640?wx_fmt=jpeg题图: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)。定义函数时,可以你指定函数的返回值类型、参数的类型。

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

def greeting(name):
    return "Hello" + name

greeting("bob")
greeting(1)

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

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

def greeting(name: str) -> str:
    return 'Hello ' + name

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

640?wx_fmt=png

# 先安装mypy
pip install mypy

$ mypy test.py
test.py:4: error: Argument 1 to "greeting" 
has incompatible type "int"; expected "str"

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

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

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

from typing import List

x = []                # type: List[Employee]
y = [1, 2]            # type: List[int]
y.append("a")

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

my_var: int  # 声明为整数类型的变量
my_var = 5  # 通过类型检查
other_var: int = 'a'  # 给整数类型变量赋值字符串,检查器会报错,但是解释器运行是不会有任何问题
print(other_var)

运行mypy

mypy xx.py  # 运行类型检查器
xx.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int")

python test.py # 运行解释器

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

T = TypeVar('T')
S = TypeVar('S')
class Foo(Generic[T]):
    def method(self, x: T, y: S) -> S:
    # Body

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

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

本文可接受反驳

推荐阅读

640?关注这个公众号的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值