由于版本间的差异,Python开发者经常需要解决不同版本的兼容问题,我们来看看有哪些方法:
一,使用ImportError
Python3中将一些Python2的模块名称做了修改,需要我们做一些处理来保证代码在不同Python版本中能够正常运行。
# -*- coding: utf-8 -*-
try:
# Python3
from configparser import ConfigParser
except ImportError:
# Python2
from ConfigParser import ConfigParser
config = ConfigParser()
# do something
urllib库也是不兼容Python2和Python3的
# -*- coding: utf-8 -*-
try:
# Python2
from urllib import urlencode
from urllib import quote
from urlparse import urlparse
import urllib2 as request
except ImportError:
# Python3
from urllib.parse import urlencode
from urllib.parse import quote
from urllib.parse import urlparse
import urllib.request as request
# do something
二,根据版本来判断
根据sys.version_info.major来判断Python的版本,根据不同的版本导入不同的库。
# -*- coding: utf-8 -*-
import sys
if sys.version_info.major == 2:
# Python2
from urllib import urlencode
from urllib import quote
from urlparse import urlparse
import urllib2 as request
else:
# Python3
from urllib.parse import urlencode
from urllib.parse import quote
from urllib.parse import urlparse
import urllib.request as request
# do something
三、使用脚本将py2代码转为py3
使用命令2to3 -w file.py可以直接在原地修改文件。其他命令可以使用2to3 --help查看;2to3 file.py可以看到转变前后的内容对比
2to3是Python自带的一个代码转换工具,可以将python2的代码自动转换为python3的代码。当然,不幸的是转换出的代码并没有对Python2的兼容做任何的处理。所以我们并不真正使用2to3转换出的代码。不过我们可以执行 2to3 file.py 查看输出信息,并修正相关问题。
四、使用python -3执行Python程序
2to3 可以检查出很多Python2&3的兼容性问题,但也有很多问题是2to3发现不了的。在加上 -3 参数后,程序在运行时会在控制台上将Python2和Python3不一致,同时2to3无法处理的问题提示出来。比如Python3和Python2中对除法的处理规则做过改变。使用-3参数执行4/2将提示 DeprecationWarning: classic int division 。
python -3 file.py
五、使用__future__导入
使用Python3的print函数,禁用Python2的print语句:from __future__ import print_function
像Python3一样,int除以int得float,而不像Python2那样是整除:from __future__ import division
像Python3一样,字符串字面量的类型为文本(Python2中的unicode,Python3中的str),而不是字节(Python2中的str,Python3中的bytes)
from __future__ import unicode_literal
Python2和Python3的print也有不同。print在Python2中是个关键字,而在Python3中是个函数。
在Python2中:
在Python3中:
还有:
六、注意列表推导式的变量作用域
在Python2中,列表推导式中的索引变量的是可以泄露到其封闭作用域中的。而Python3中则不可以。
下面举一个简单的例子说明这个问题,如我们在一个for循环内部使用列表推导式:
for i in range(2):
a = [i for i in range(5)]
print(i)
在Python3中,上面的代码输出为
>>0
>>1
而在Python2中,上面的代码输出为
>>4
>>4
内容参考:
— — — — — — E N D — — — — — —
往期文章:
真格量化可访问:
真格量化微信公众号,长按关注:
遇到了技术问题?欢迎加入真格量化Python技术交流QQ群 726895887