不少状况下你可能会想要开发一个程序能同时在python2和python3中运行。html
想象一下你开发了一个模块,成百上千的人都在使用它,但不是全部的用户都同时使用python 2和3。这种状况下你有两个选择。第一种状况,你能够讲2种模块分开,分别为python2和python3开发一个。另外一种状况就是,你能够修改你现有的代码,使其同时支持python2和python3。python
今天咱们来说一些方法使你的代码能同时兼容它们。微信
首先,也是最重要的的方法便是__future__模块的导入。它使你能在python2中引入python3的功能模块。下面举例说明:app
上下文管理器是python2.6+中的新特新,假如你要在python2.5中使用它:ide
from __future__ import with_statement
python2中的print语法在python3中变成了print()函数,若是你想要在python2中使用print()函数,你能够从__future__模块中引入它:函数
print # Output: from __future__ import print_function print(print) # Output: <built-in function print>
首先,告诉我在你的代码中你是怎样引入包的呢?大部分应该是这样的:ui
import foo # or from foo import bar
那你是否有尝试过,其实你能够这样作:url
import foo as foo
其实这二者的效果是同样的,可是要使你的代码兼容python2和python3这是相当重要的,由于你能够这样作:spa
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调用。code
另一些要记住的就是,在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的方法:
pip install enum34
pip install singledispatch
pip install pathlib
进一步阅读,在python文档 comprehensive guide中有更加详细的说明使你的代码能同时兼容python2和python3。
原文地址:http://book.pythontips.com/en/latest/targeting_python_2_3.html
欢迎多来访问博客:http://liqiongyu.com/blog
微信公众号: