Python 中的

Python 中的 __future__ 模塊介紹

__future__模塊是什麼

__future__模塊是什麼

隨著Python3的普及,現在還在使用Python2版本的同學為了避免當前版本運行正常的代碼,在升級至Python3版本後運行可能出現異常的現象發生,大多會使用"from __future__ import FeatureName",使得在舊的Python版本中能夠兼顧未來版本的新特性。

也就是說,如果某個版本中出現了新的功能特性,並且這個新特性和當前版本中不兼容(在該版本中不符合語言標準),那麼想要使用的話就需要從__future__模塊中導入了。

閱讀__future__.py模塊代碼,不難得出如下信息:

(1)自python2.1起, 當一個新的語言特性首次出現在發行版中, 如果該新特性與舊版本python不兼容, 則該特性將會被默認禁止調用。如果想調用這個新特性, 則必須使用 “from __future__ import FeatureName”進行導入。

(2)future__模塊主要作用是提供某些將要引入的模塊(當前版本不存在),而import則是引入已經在該版本發佈的模塊。如,python3版本之前print並不是一個函數。

print_function = _Feature((2, 6, 0, "alpha", 2), 

(3, 0, 0, "alpha", 0),
CO_FUTURE_PRINT_FUNCTION)

(3)_future__這個模塊在2.1版本時才存在,若在此版本之前導入將產生異常。同時,當環境升級至以後的某個版本中,某個特性已經成為標準的一部分,那麼使用該特性就不用從__future__導入了。

nested_scopes = _Feature((2, 1, 0, "beta", 1),
(2, 2, 0, "alpha", 0),
CO_NESTED)

(4)避免因為版本的更新,導致原有可正常運行的代碼,出現異常。比如下面這行代碼在python2.7中可以運行,但在python3.0中會異常。

print ‘xiaowukongqimotuo’

(5)from __future__ import FeatureName 必須在文件的開頭引用,否則會觸發SyntaxError異常

Python 中的 __future__ 模塊介紹

__future__模塊包含哪些新特性

__future__模塊包含哪些新特性

Python 中的 __future__ 模塊介紹

__future__.py部分源碼截圖

通過__future__.py模塊可以看到,python2可以使用python3的哪些新特性:

unicode_literals、division、print_function、absolute_import

unicode_literals

  • Python 2有兩種字符串類型:Unicode字符串和非Unicode字符串,字符串是以beytes方式存儲的。
  • Python 3只有一種類型:Unicode字符串,字符串是以unicode方式存儲的

在python2 中導入python3支持的unicode_literals特性後,s = '小悟空騎摩托,默認就是Unicode方式存儲的,這對應了Python2 的s = u'小悟空騎摩托'。

Python 中的 __future__ 模塊介紹

輸出:

Python 中的 __future__ 模塊介紹

同時需要了解的是,對於str類型的字符串,調用len()和遍歷時,是以字節為單位的,使得相同字符的不同的編碼格式,長度往往是不同的。對unicode類型的字符串調用len()和遍歷是以字符為單位,這其實是我們所期望的。

division(精確除法)

在python2 中導入python3支持的division特性後,即from __future__ import division ,"/"執行的是精確除法,"//"執行的是整除。當我們在程序中沒有導入該特徵時,"/"操作符執行的只能是整除(取整)。

Python 中的 __future__ 模塊介紹

輸出:

Python 中的 __future__ 模塊介紹

print_function

在python2 中導入python3支持的print_function特性後,新的print是一個函數。如果導入此特性,之前的print xxx語句就不能用了,會拋SyntaxError異常。

Python 中的 __future__ 模塊介紹

輸出

Python 中的 __future__ 模塊介紹

absolute_import(拒絕隱式引用,絕對導入)

比如當我們面臨如下目錄結構時,
-Toutiao/
--Toutiao/init.py
--Toutiao/future.py
--Toutiao/string.py

如果你在future.py中寫import string,那麼在Python 2.4或之前(相對導入), Python會先查找Toutiao目錄下有沒有string.py, 若找到了,則直接引入該模塊。如果此時真正的意圖是想使用系統標準的string.py呢?這時候就需要"from __future__ import absolute_import"了。這樣,就可以用import string來引入

系統環境路徑裡的標準string.py模塊,而用from Toutiao import string來引入Toutiao目錄下的string.py了。


分享到:


相關文章: