不少狀況下你可能會想要開發一個程序能同時在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
微信公衆號: