最近把Mac上的默认Python换成了3.5,如果将来需要用仅支持Python2的模块,打算通过新建虚拟环境解决。而在此前主要用的是2.7。切换版本的起因是看到Django会在2020年之后停止支持Python2的消息,这才知道2020年也是Python2官方停止支持的时间点。以前就读到过一篇讲转移到Python3的文章,当时公司集群和流程默认都用的2.7,没把这个太当回事儿。如今一晃两三年过去了,Python3已经走到了3.6。这两天读了官网和一些Python核心开发者的文章,把一些感想记录下来。
为何应该转到Python32020年后Python2不会再有官方的安全更新发布,意味着这之后Python2不再有官方的维护;
Redhat、Fedora等Linux发行版之后默认安装Python3(现在一般是两个版本都有,以后可能会不再提供2),意味着那之后再想使用Python2,需要自己安装。
诸如Django这样广泛使用的编程框架,开始追随Python的更新步伐,在新版(1.11)中放弃对Python2的支持(目前BioPython是两个都支持,还没看到停止支持2的时间表)。
上面提的都是更新的推力,使用Python3的吸引力是什么呢?没错,是3.x中的语言特性。直到不久前,我对3.x的印象还停留在对unicode支持和print改为函数上面。
Python3早在2008年就推出了,经过8年多的发展,引入的新特性远不止这些。这里只列举几个看到的印象最深的例子。
#矩阵相乘运算符:@
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
#解包
a, b, *rest = [1, 2, 3, 4, 5]
rest
# [3, 4, 5]
#函数注释
def greeting(name: str) -> str:
return 'Hello ' + name
第一眼看到这个函数注释的语言,着实受了一惊:函数定义还能这样,还是我熟悉的Python吗?这种写法和C/Java/Go等静态语言的函数定义有些类似,只不过这里的参数类型写在后面。需要说明的是,这个仅是注释,运行时并不会自动校验参数和返回值是否合法,所以和编译语言还是不同的,但这样做的好处,就是可以省去在函数的docstring里声明参数和返回值类型,参数类型一目了然,这就是所谓的”self documented code”。有关3.5的更多特性,可以参看官方文档。
可能面临的障碍平台环境限制:比如你用的服务器上默认还是2.6。
这个容易克服。需要用3.x,可以下载自己编译,或者使用conda,关于conda如何使用,可参考之前介绍conda的文章,用它安装Python或R/Perl的包也很方便。正在用的模块不支持Python3怎么办?
有没有其他类似功能且支持3.x的模块?或者自己尝试将它移植到Python3,官方就有提供2到3的自动转换工具,除去个别程序调用C扩展的特殊情况外,移植过程通常不难。
题图:Josh Jones