Python `__future__` 模塊 - PyTips 0x15

PyTips

項(xiàng)目地址:https://git.io/pytips

我們經(jīng)常從一些組織良好的 Python 項(xiàng)目中看到 __future__ 的身影,例如:

from __future__ import absolute_import, division

__future__ 模塊由 PEP 236 提出并加入到 Python 2.1,其存在的主要原因是 Python 的版本升級(jí)經(jīng)常會(huì)增加一些新的特性,而 __future__ 模塊將一些新版本中將會(huì)增加的新的特性進(jìn)行聲明,同時(shí)使得舊版本可以使用這些新的語(yǔ)法特性。當(dāng)然,如果你用的是 Python 2.1 以前的版本,是沒(méi)辦法使用 __future__ 的。__future__ 模塊的導(dǎo)入一定要放在最上方,也就是在所有其它模塊之前導(dǎo)入。

根據(jù) Python 3.5 中 __future__源文件,一共包括下面幾個(gè)新特性:

__future__

表中第一列包含了所有可以從 __future__ 中導(dǎo)入的特性,optional in 中的版本號(hào)為最低可使用的版本,mandatory in 中的版本號(hào)為已經(jīng)實(shí)現(xiàn),無(wú)需從 __future__ 導(dǎo)入 的版本號(hào)。最后一列是每個(gè)新特性所對(duì)應(yīng)的 PEP 及簡(jiǎn)單描述。下面主要看一下幾個(gè) 3.0 之后添加的屬性。

division

在 3.0 之前,除號(hào) / 的用法都是整除,例如在 2.7 中,8/7=1,如果需要浮點(diǎn)數(shù)相除,需要顯式使用浮點(diǎn)數(shù)類型:8./7=1.1428571428571428,如果是使用變量相除,則需要 a*1.0/7。而在 3.0 以后的版本,整除和浮點(diǎn)數(shù)相除分別使用 /// 符號(hào):

from __future__ import division
print(8//7)
print(8/7)
1
1.1428571428571428

absolute_import

PEP 328 主要添加了多行導(dǎo)入和絕對(duì)/相對(duì)導(dǎo)入的特性,可以使用括號(hào)而不是 \ 來(lái)進(jìn)行多行導(dǎo)入。相對(duì)導(dǎo)入則可以使用 . 為標(biāo)記導(dǎo)入相對(duì)目錄中的模塊,具體可以參考這篇文章:Python導(dǎo)入模塊的幾種姿勢(shì)。

from __future__ import absolute_import

from tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

print_function

我們都知道 3.0 以后 print 變?yōu)楹瘮?shù)而不再是聲明語(yǔ)句,而是一個(gè)內(nèi)置函數(shù),并且可以接受除打印內(nèi)容以外的參數(shù):

print(*args, sep=' ', end='\n', file=None)

from __future__ import print_function
print("Hello", "World", sep=',', end='!')
Hello,World!

generator_stop

在生成器內(nèi)部使用 raise StopIteration 意味著生成器終止,但這樣寫(xiě)會(huì)造成一些隱藏的 BUG(見(jiàn) PEP 479),新的特性要求杜絕這一用法并拋出 RuntimeError,若要終止生成器,請(qǐng)使用 return。

from __future__ import generator_stop
def gen(n):
    i = 0
    while i < n:
        yield i
        i += 1
        if i % 2 == 0:
            raise StopIteration
            # use return
        
g = gen(3)
print(next(g))
print(next(g))
try:
    print(next(g))
except RuntimeError as err:
    print(err)
0
1
generator raised StopIteration

彩蛋

為了吸引更多 Java、C 等語(yǔ)言的用戶,使他們更快適應(yīng) Python 代碼縮進(jìn)的語(yǔ)法同時(shí)又能兼容他們不可抑制地輸入 {} 的沖動(dòng),__future__ 還提供了 braces 特性,使花括號(hào)可以被正確解析!

from __future__ import braces
歡迎關(guān)注公眾號(hào) PyHub !
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)置函數(shù)Python解釋器內(nèi)置了許多功能和類型,總是可用的。他們是按字母順序列在這里。 abs(x)返回一個(gè)數(shù)的絕...
    uangianlap閱讀 1,363評(píng)論 0 0
  • 文/Bruce.Liu1 1.Python前世今生 1.1.Python歷史 Python的創(chuàng)始人: Guido ...
    BruceLiu1閱讀 12,435評(píng)論 3 119
  • 模塊簡(jiǎn)介 在軟件開(kāi)發(fā)過(guò)程中,隨著代碼的不斷增加,在一個(gè)問(wèn)價(jià)里代碼就會(huì)越來(lái)越長(zhǎng),不容易維護(hù)。為了編寫(xiě)可維護(hù)的代碼,我...
    齊天大圣李圣杰閱讀 887評(píng)論 0 0
  • 前言 Python的創(chuàng)始人為Guido van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打...
    依依玖玥閱讀 3,706評(píng)論 6 37
  • 在Python2.7代碼中經(jīng)常能看到使用__future__模塊。那么__future__到底是做什么的呢? 簡(jiǎn)介...
    Syfun閱讀 10,836評(píng)論 0 51

友情鏈接更多精彩內(nèi)容