融合python2和python3

不少狀況下你可能會想要開發一個程序能同時在python2和python3中運行。html

想象一下你開發了一個模塊,成百上千的人都在使用它,但不是全部的用戶都同時使用python 2和3。這種狀況下你有兩個選擇。第一種狀況,你能夠講2種模塊分開,分別爲python2和python3開發一個。另外一種狀況就是,你能夠修改你現有的代碼,使其同時支持python2和python3。python

今天咱們來說一些方法使你的代碼能同時兼容它們。微信

Future import

首先,也是最重要的的方法便是__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

一些廢棄的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

微信公衆號:

相關文章
相關標籤/搜索