原标题:Spider163同时支持python2.x和python3.x的演进之路
在去年上半年,笔者还信誓旦旦地说:
“python3.x不支持了,因为历史原因本项目用的python2.x开发,迁到python3.x的改动有点繁琐,索性一直python2.x好了。”
那时候说这话,对python社区还不是很了解,自然也不清楚python3.x才是“人类大趋势”,故而有些懒惰。(很多流行开源库已经抛弃python2.x了)
截止到2017年年底,Spider163从一款最初只是为了抓取网易云音乐热评的工具,演进增加了抓取歌词、下载会员歌曲等功能,并对很多基础功能做了很多底层优化,还增加了一个算得上可以用的WEB UI。
在这些功能做到稍微不错的用户体验的时候,迁移到python3.x来到了Spider163开发计划的靠前位置。
结论是:
2018年1月14日,Spider163从2.6.3直接更新至2.7.0,完成兼容python2.x和python3.x的里程碑意义的工作。
这算不上是新功能的更新,纯粹是让用户使用上更方便,python3.x下也许会有一些未测试的bug,希望大家遇到问题在GitHub上提issue,我会在一周内回复。
Github地址:https://github.com/Chengyumeng/spider163
因为算不上功能性的更新,接下来就介绍下主要改变的地方吧。
判断python版本
sys包内有一个version的变量,可以通过该变量判别python版本,例如,在我的python 3环境下,该变量的值为:
3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
语法更新
有一些代码格式在python 2.x中支持两种写法,在python 3.x中删除了某一种过于随意的表达方式,对于这种情况,主要操作就是检查代码,去掉不符合python 3.x的语法表达。
例如,在python2中,下列代码是合法的:
for i in range(9.0):
print(i)
解释器会对float变量隐式转换为整型,而在python3.x中就必须显示类型转换,需要写成:
for i in range(int(9.0)):
print(i)
相同的例子还发生在str类型和byte类型的变量合并的情形下,在python 2.x中,下面语法是可接受的:
b'a' + 'b'
但是在python3.x中就是有问题的。
……
凡此种种都需要改进。
考虑到spider163底层全都是文本处理和加密解密操作,因此会面对很多python的兼容性问题,因此编写了很多工具性函数统一处理。
库的不兼容
有一些第三方库,只有python2.x的库,升级python3.x就要换库了,比较常见的例子就是mysql的库,为此要根据Python的版本,安装对应的库,这种需要在setup.py中设计。
还有一些系统库,在python2.x升级到python3.x的时候,为统一命名风格改换了名字,比较常见的是configparser这个库,在python2.x和Python3.x中的命名就是不同的,为此我采用如下手段兼容:
if version.PYTHON3 is True:
import configparser as ConfigParser
else:
import ConfigParser
以上就是spider163从2.6.3到2.7.0的升级之路,欢迎大家pip install Spider163使用,抑或关注公众账号:程天写代码交流。
↓阅读原文了解项目返回搜狐,查看更多
责任编辑: