__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異常
__future__模塊包含哪些新特性
通過__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'小悟空騎摩托'。
輸出:
同時需要了解的是,對於str類型的字符串,調用len()和遍歷時,是以字節為單位的,使得相同字符的不同的編碼格式,長度往往是不同的。對unicode類型的字符串調用len()和遍歷是以字符為單位,這其實是我們所期望的。
division(精確除法)
在python2 中導入python3支持的division特性後,即from __future__ import division ,"/"執行的是精確除法,"//"執行的是整除。當我們在程序中沒有導入該特徵時,"/"操作符執行的只能是整除(取整)。
輸出:
print_function
在python2 中導入python3支持的print_function特性後,新的print是一個函數。如果導入此特性,之前的print xxx語句就不能用了,會拋SyntaxError異常。
輸出
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了。閱讀更多 測試開發技術棧 的文章