让python同时兼容python2和python3的8个技巧分享


Posted in Python onJuly 11, 2014

python邮件列表里有人发表言论说“python3在10内都无法普及”。在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大。你只需要对自己的代码稍微做些修改就可以很好的同时支持python2和python3的。下面我将简要的介绍一下如何让自己的python代码如何同时支持python2和python3。

一、放弃python 2.6之前的python版本

python 2.6之前的python版本缺少一些新特性,会给你的迁移工作带来不少麻烦。如果不是迫不得已还是放弃对之前版本的支持吧。

二、使用 2to3 工具对代码检查

2to3是python自带的一个代码转换工具,可以将python2的代码自动转换为python3的代码。当然,不幸的是转换出的代码并没有对python2的兼容做任何的处理。所以我们并不真正使用2to3转换出的代码。执行2to3 t.py 查看输出信息,并修正相关问题。

三、使用python -3执行python程序

2to3 可以检查出很多python2&3的兼容性问题,但也有很多问题是2to3发现不了的。在加上 -3 参数后,程序在运行时会在控制台上将python2和python3不一致,同时2to3无法处理的问题提示出来。比如python3和python2中对除法的处理规则做过改变。使用-3参数执行4/2将提示 DeprecationWarning: classic int division 。

四、from __future__ import

“from __future__ import”后即可使使用python的未来特性了。python的完整future特性可见 __future__ 。python3中所有字符都变成了unicode。在python2中unicode字符在定义时需要在字符前面加 u,但在3中则不需要家u,而且在加u后程序会无法编译通过。为了解决该问题可以 “from future import unicode_literals” ,这样python2中字符的行为将和python3中保持一致,python2中定义普通字符将自动识别为unicode。

五、import问题

python3中“少”了很多python2的包,在大多情况下这些包之是改了个名字而已。我们可以在import的时候对这些问题进行处理。

try:#python2

    from UserDict import UserDict

    #建议按照python3的名字进行import

    from UserDict import DictMixin as MutableMapping

except ImportError:#python3

    from collections import UserDict

    from collections import MutableMapping

六、使用python3的方式写程序

python2中print是关键字,到了python3中print变成了函数。事实上在python2.6中已经带了print函数,所以对print你直接按照2to3中给出的提示改为新写法即可。在python3中对异常的处理做了些变化,这个和print类似,直接按照2to3中的提示修改即可。

七、检查当前运行的python版本

有时候你或许必须为python2和python3写不同的代码,你可以用下面的代码检查当前系统的python版本。

import sys

if sys.version > '3':

    PY3 = True

else:

    PY3 = False

八、six

six 提供了一些简单的工具用来封装 Python 2 和 Python 3 之间的差异性。我并不太推荐使用six。如果不需要支持python2.6之前的python版本,即使不用six也是比较容易处理兼容性问题的。使用six会让你的代码更像python2而不是python3。
python3的普及需要每位pythoner的推动,或许你还无法立即升级到python3,但请现在就开始写兼容python3的代码,并在条件成熟时升级到python3。

注:python2同python3的差异

如果你更全面的了解从python2迁移到python3的相关问题,推荐阅读 Porting to Python 3 这是一本免费的python读物。

Python 相关文章推荐
python实现图像识别功能
Jan 29 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
python SOCKET编程基础入门
Feb 27 Python
Python合并pdf文件的工具
Jul 01 Python
python实现商品进销存管理系统
May 30 Python
Python操作SQLite简明教程
Jul 10 #Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 #Python
Python采集腾讯新闻实例
Jul 10 #Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 #Python
Python语言的12个基础知识点小结
Jul 10 #Python
使用Python获取Linux系统的各种信息
Jul 10 #Python
Django中实现一个高性能计数器(Counter)实例
Jul 09 #Python
You might like
终于听上了直流胆调频
2021/03/02 无线电
在字符串中把网址改成超级链接
2006/10/09 PHP
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
smarty内置函数section的用法
2015/01/22 PHP
PHP正则验证Email的方法
2015/06/15 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
JavaScript 学习技巧
2010/02/17 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
python运行时间的几种方法
2016/06/17 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
python中cPickle类使用方法详解
2018/08/27 Python
django模板结构优化的方法
2019/02/28 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
外贸主管求职简历的自我评价
2013/10/23 职场文书
历史系自荐信范文
2013/12/24 职场文书
心理健康心得体会
2014/01/02 职场文书
文明风采获奖感言
2014/02/18 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
写给同事的离职感言
2015/08/04 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js