
項(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__ 中導(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
