融合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 ...
随机推荐
- 利用for循环求1-100之间的奇数和 and 0-100的偶数和
为了方便自己计算,以下代码只求1-10的奇数和 and 0-10的偶数和 1-10的奇数从1开始分别为1.3.5.7.9 代码如下 /* Name:循环语句得出奇数.偶数并相加求和 Copyright ...
- html5 note
HTML5的特点 绘图支持 canvas 多媒体支持 video audio 离线应用 和 离线存储 新的语义化元素 article footer header nav section 表单增强 ca ...
- Win7下使用protel99se、protel99
很多网友需要用的protel99se,由于该软件开发的时间比较就早,在现在笔记本普及,尤其是win7普及的情况下,用该软件着实让许多人头痛,有人选择安装XP系统,但这就牺牲了win7良好的操作体验.也 ...
- 在基类中的析构函数声明为virtual
#include <iostream> using namespace std; class Father { public: ~Father() { cout << &quo ...
- 表单验证插件 jquery.validata 使用方法
参考资料:http://www.runoob.com/jquery/jquery-plugin-validate.html 下载地址 jquery.validate插件的文档地址http://docs ...
- Dos关闭进程命令
netstat -ao 查找占用端口的进程 taskkikk /pid 端口pid /f
- 使用iscroll4可能会遇到的问题(转:记录)
1.在iscroll4的滚动容器范围内,点击input框.select等表单元素时没有响应这个问题原因在于iscroll需要一直监听用户的touch操作,以便灵敏的做出对应效果,所以它把其余的默认事件 ...
- Oracle 批量造数据
1.通过存储过程方式 CREATE OR REPLACE procedure XXZY.p_test is i number; begin .. loop INSERT INTO test_job V ...
- 0603 python 基础02
作业1:ANSI和utf8的区别? ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits). 可以表示的最大字符数是256,一般只用前128个(最高位为0),其中包括 ...
- IOS 表视图(UITableVIew)的使用方法(3)名单的索引显示
当数据量特别大时,简单地以role进行分段,对实际查找的效率提升并不大.就像上一节开头所说,开发者可以根据球员名字的首字母进行分段,且分成26段.由于段数较多,可以使用UITableView的索引机制 ...