融合python2和python3
很多情况下你可能会想要开发一个程序能同时在python2和python3中运行。
想象一下你开发了一个模块,成百上千的人都在使用它,但不是所有的用户都同时使用python 2和3。这种情况下你有两个选择。第一种情况,你可以讲2种模块分开,分别为python2和python3开发一个。另一种情况就是,你可以修改你现有的代码,使其同时支持python2和python3。
今天我们来讲一些方法使你的代码能同时兼容它们。
Future import
首先,也是最重要的的方法即是__future__模块的导入。它使你能在python2中引入python3的功能模块。下面举例说明:
上下文管理器是python2.6+中的新特新,假如你要在python2.5中使用它:
from __future__ import with_statement
python2中的print语法在python3中变成了print()函数,如果你想要在python2中使用print()函数,你可以从__future__模块中引入它:
# Output: from __future__ import print_function
print(print)
# Output: <built-in function print>
解决模块重命名:
首先,告诉我在你的代码中你是怎样引入包的呢?大部分应该是这样的:
import foo
# or
from foo import bar
那你是否有尝试过,其实你可以这样做:
import foo as foo
其实这两者的效果是一样的,但是要使你的代码兼容python2和python3这是至关重要的,因为你可以这样做:
try:
import urllib.request as urllib_request # for Python 3
except ImportError:
import urllib2 as urllib_request # for Python 2
所以让我来解释一下上面的代码,我们使用try/except语句包住了我们的引入代码。我们这么做是因为在python2中没有urllib.request模块所以它会产生一个ImportError。其中python3中的urllib.request模块的内容和python2中的urllib2是一样的。所以通过以上代码在python3中我们会引入urllib.request而在python2中我们会引入urllib2,而且都是通过别名urllib_request调用。
一些废弃的python2内置
另外一些要记住的就是,在python3中已经移除的12中python2中的内置功能。切记不要在python2中使用它们如果你要你的python2代码同时兼容python3的话。下面这个方法能强制你不能使用这12个废弃的方法:
from future.builtins.disabled import *
现在,无论何时你想要使用这些废弃的模块,都会引起NameError错误:
from future.builtins.disabled import * apply()
# Output: NameError: obsolete Python 2 builtin apply is disabled
非标准库的安装
这有一些第三方的库让你在python2中可以使用python3的方法:
- enum
pip install enum34
- singledispatch
pip install singledispatch
- pathlib
pip install pathlib
进一步阅读,在python文档 comprehensive guide中有更加详细的说明使你的代码能同时兼容python2和python3。
原文地址:http://book.pythontips.com/en/latest/targeting_python_2_3.html
欢迎多来访问博客:http://liqiongyu.com/blog
微信公众号:
融合python2和python3的更多相关文章
- python2迁移python3的问题
▌使用 pathlib 模块来更好地处理路径 pathlib 是 Python 3默认的用于处理数据路径的模块,它能够帮助我们避免使用大量的 os.path.joins语句: from pathlib ...
- python2 与 python3 urllib的互相对应关系
urllib Python2 name Python3 nameurllib.urlopen() Deprecated. See urllib.request.urlopen() which mirr ...
- 在同一台电脑上同时安装Python2和Python3
目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3,取决于当前要使用的库.框架支持哪个版本. 例如:HTM ...
- python2与python3在windows下共存
python有python2(工业版)和python3,有时候我们会希望电脑上既有python2也有python3,!假设我们已经安装好,python2和python3了, 接下来我们找到python ...
- Python2.7<-------->Python3.x
版本差异 from __future__ Python2.7 Python3.x 除法 / // Unicode u'' ...
- 同时使用python2和Python3
问题:thrift生成的是python2代码,之前使用的是Python3因此需要同时使用两个版本. 方案:将python3的可执行文件重命名为python3(默认为Python),这样使用pyhton ...
- python2 到 python3 转换工具 2to3
windows系统下的使用方法: (1)将python安装包下的Tools/Scripts下面的2to3.py拷贝到需要转换文件目录中. (2)dos切换到需要转换的文件目录下,运行命令2to3.py ...
- windows下同时安装python2与python3
由于python2与python3并不相互兼容,并且差别较大,所以有时需要同时安装,但在操作命令行时,怎么区别python2与python3呢? 1.下载并安装Python 2.7.9和Python ...
- 爬虫入门---Python2和Python3的不同
Python强大的功能使得在写爬虫的时候显得十分的简单,但是Python2和Python3在这方面有了很多区别. 本人刚入门爬虫,所以先写一点小的不同. 以爬取韩寒的一篇博客为例子: 在Python2 ...
随机推荐
- localstroge可以在页面间传递数值;
连接地址为:http://4.suancai.sinaapp.com/localstorg/a.html 原理是,a页面设置了sessionstorge,b页面可以访问到; 并且已关闭浏览器,sest ...
- Android MediaPlayer Error -1004
之前用Android自带的VideoView播放在线视频一直没问题的.今天突然碰到无法播放. MediaPalyer返回的错误代码是-1004,API文档上写的是:Bitstream is not c ...
- 一套手写ajax加一般处理程序的增删查改
倾述下感受:8天16次驳回.这个惨不忍睹. 好了不说了,说多了都是泪. 直接上代码 : 这个里面的字段我是用动软生成的,感觉自己手写哪些字段太浪费时间了,说多了都是泪 ajax.model层的代码: ...
- 与html相关的知识点整理
梳理html时发现的一些问题.总结一下,答案大都从网上找来. 一.html 与 htm 的区别 没有本质的区别..htm是在win32时代,系统只能识别3位扩展名时使用的.现在一般都使用.html. ...
- zoj 1109 zoj 1109 Language of FatMouse(字典树)
好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...
- SQL Server 判断表中是否存在某字段
功能:判断表中是否存在某字段,若不存在,则新增该字段 语句: IF NOT EXIST (SELECT 1 FROM [DATABASE].[SCHEMA].SYSCOLUMNS WHERE ID=O ...
- 【转】CxImage图像库的使用
CxImage下载地址:http://www.codeproject.com/KB/graphics/cximage/cximage600_full.zip 作者:Davide Pizzolato C ...
- Problem D: Integer Inquiry
Problem D: Integer InquiryTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 41 Solved: 12[Submit][Status ...
- JQuery中回车键登陆
//点击回车键 //王东升/2015/3/11 document.onkeydown = function (event) { var e = event ? event : (window.even ...
- 5.6.3 String类型
String类型是字符串的对象包装类型,可以像下面这样使用String构造函数来创建. var stringObject = new String("hello world"); ...