让你的python程序同时兼容python2和python3

标签: python 程序 python2 | 发表时间:2013-01-13 13:50 | 作者:
出处:http://simple-is-better.com/

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。

注:

# 来源: 天地一沙鸥


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [python 程序 python2] 推荐:

让你的python程序同时兼容python2和python3

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

Python程序员培训计划

- 敏 - 我的宝贝孙秀楠 ﹣C++, Lua, 大连,程序员
Python程序员很幸福,因为他们不需要像C#程序员那样东一榔头西一棒子的找资源学习. 把下面资源按顺序学完,代码都自己手敲过,应该就是初级以上水平了. 之所以选择py3k,是感觉新版本的生命力应该更长久一些. 学完tutorial,再看看这个Python竞赛,花个一两周时间搞定它. 最后看看这本书,了解一些有趣的话题.

提高 Python 程序的运行速度

- Ken - python.cn(jobs, news)
尝试了一下用Python实现的K-Means Clustering算法,抽样了10000篇百科词条,分为1000个类,分词后词语总数为130000左右. 如果把1000个类定义为1000个向量,每个向量的元素个数为130000,K-Means Clustering算法的第一步是初始化这1000个向量的值,如果每个向量元素的值用float型存储,则需要的内存为:.

提高Python程序的运行速度

- Guancheng(冠诚) - 冬天里的酒吧
尝试了一下用Python实现的K-Means Clustering算法,抽样了10000篇百科词条,分为1000个类,分词后词语总数为130000左右. 如果把1000个类定义为1000个向量,每个向量的元素个数为130000,K-Means Clustering算法的第一步是初始化这1000个向量的值,如果每个向量元素的值用float型存储,则需要的内存为:.

Python程序的执行原理

- - 非技术 - ITeye博客
Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行. 字节码在Python虚拟机程序里对应的是PyCodeObject对象. .pyc文件是字节码在磁盘上的表现形式. PyCodeObject对象的创建时机是模块加载的时候,即import.

探究如何给Python程序做hotfix

- - IT瘾-tuicool
使用Python来写服务器端程序,很大的一个优势就是可以进行热更新,即在不停机的情况下,使改动后的程序生效. 在开发阶段,这个功能可以大大提高开发效率(写代码–启动服务器–看效果–改代码–hotfix–看效果–提交~);而在生产环境中,可以以最小的代价(不停机)修复线上的bug. 我在项目中使用hotfix功能很长世间了,大概了解它是利用了Python的import/reload功能,但是并没有去自己研究过.

每个程序员都应该学习使用Python或Ruby

- Kings - 开源中国社区最新新闻
本文是从 Why every programmer should learn Python or Ruby 这篇文章翻译而来. 如 果你是个学生,你应该会C,C++和Java. 还会一些VB,或C#/.NET. 多少你还可能开发过一些Web网页,你知道一些HTML,CSS和 JavaScript知识.

Python程序语言快速上手教程

- - SEM WATCH
本文是面向SEO人群的Python程序语言入门教程,也适用于其他没有程序基础但想学习些程序,以解决简单的实际应用需求的人群. 在后面会尽量用最基础的角度来介绍这门语言. 本来打算从网上找一篇入门教程,但因为Python很少是程序员的第一次接触程序所学的语言,所以网上现有的教程多不是很基础,还是决定自己写下这些.

全面解读python web 程序的9种部署方式

- - 鲁塔弗的博客
python有很多web 开发框架,代码写完了,部署上线是个大事,通常来说,web应用一般是三层结构. 主流的web server 一个巴掌就能数出来,apache,lighttpd,nginx,iis. application,中文名叫做应用服务,就是你基于某个web framework写的应用代码.

Python 程序员应该知道的 10 个库

- - 博客 - 伯乐在线
Python是优雅的,使用这些库可以使你的代码更简洁,并保持持久性. 抛弃 optparse和 argparse吧,使用 docstrings来构建优雅的,可读性强的,并且复杂(如果你需要的话)的命令行界面. IMO2013年创建的最好的库. Requests,或称为人类使用的HTTP,是一个处理HTTP请求更为pythonic 的方法,比 urllib2更更更好用.