__future__
常常出如今Python模塊中。 即便閱讀了Python的__future__
文檔,我也不瞭解__future__
是什麼__future__
以及如何/什麼時候使用它。 html
有人能夠舉例說明嗎? node
關於我收到的__future__
的基本用法的一些答案彷佛是正確的。 python
可是,我還須要瞭解有關__future__
工做原理的另外一件事: 程序員
對我來講,最使人困惑的概念是當前的python版本如何包含將來版本的功能,以及如何使用當前版本的Python成功地編譯使用將來版本的功能的程序。 函數
我猜測當前版本包含了未來的潛在功能。 可是,這些功能僅可經過使用__future__
來使用,由於它們不是當前標準。 讓我知道我是否正確。 spa
仍是說「因爲這是python v2.7,因此請使用在python 3中添加後也已添加到python v2.7中的那個不一樣的'print'函數。所以,個人'print'將再也不是語句(例如,打印「 message」),但具備功能(例如,print(「 message」,選項)。這樣,當個人代碼在python 3中運行時,「 print」不會中斷。」 code
在 htm
from __future__ import print_function
print_function是包含「 print」的新實現的模塊,具體取決於python v3中的行爲。 對象
這有更多解釋: http : //python3porting.com/noconv.html ci
__future__
是一個僞模塊,程序員可使用它來啓用與當前解釋器不兼容的新語言功能 。 例如,表達式11/4
當前求值爲2
。 若是執行該模塊的模塊經過執行如下命令啓用了真除法:
from __future__ import division
表達式11/4
將得出2.75
。 經過導入__future__
模塊並評估其變量,您能夠看到新功能什麼時候首次添加到語言中以及什麼時候將成爲默認功能:
>>> import __future__ >>> __future__.division _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
我發現很是有用的用途之一是__future__
模塊中的print_function
。
在Python 2.7中,我但願未來自不一樣打印語句的字符打印在同一行上而沒有空格。
能夠在最後使用逗號(「,」)來完成此操做,可是它還會附加一個額外的空間。 上面的語句用做:
from __future__ import print_function ... print (v_num,end="") ...
這將在v_num
打印每次迭代中的v_num
值, v_num
帶空格。
從Python 3.0開始,print再也不只是一個語句,而是一個函數。 幷包含在PEP 3105中。
我也認爲Python 3.0包仍然具備這些特殊功能。 讓咱們經過Python中的傳統「金字塔程序」查看其可用性:
from __future__ import print_function class Star(object): def __init__(self,count): self.count = count def start(self): for i in range(1,self.count): for j in range (i): print('*', end='') # PEP 3105: print As a Function print() a = Star(5) a.start() Output: * ** *** ****
若是咱們使用普通的打印功能,將沒法得到相同的輸出,由於print()帶有額外的換行符。 所以,每次執行內部for循環時,它將在下一行上打印*。
已經有一些不錯的答案,可是沒有一個能解決__future__
語句當前支持的內容的完整列表。
簡而言之, __future__語句會強制Python解釋器使用該語言的更新功能。
當前支持的功能以下:
nested_scopes
:
在Python 2.1以前,如下代碼將引起NameError :
def f(): ... def g(value): ... return g(value-1) + 1 ...
from __future__ import nested_scopes
指令將容許啓用此功能。
generators
:
引入瞭如下生成器函數,以在連續的函數調用之間保存狀態:
def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b
division
:
在Python 2.x版本中使用經典除法。 意味着某些除法語句返回合理的除法近似值(「真除法」),而其餘除法語句返回下限(「地板除法」)。 從Python 3.0開始,真除法由x/y
指定,而底除由x//y
指定。
from __future__ import division
指令強制使用Python 3.0樣式劃分。
absolute_import
:
容許括號內包含多個import
語句。 例如:
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, RIDGE, END)
代替:
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \ LEFT, DISABLED, NORMAL, RIDGE, END
要麼:
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END
with_statement
:
在Python中添加語句「 with」做爲關鍵字,以消除對try/finally
語句的須要。 在執行文件I / O時,一般的用法是:
with open('workfile', 'r') as f: read_data = f.read()
print_function
:
強制使用Python 3括號樣式的print
函數調用,而不是print MESSAGE
樣式的打印語句。
unicode_literals
:
介紹bytes
對象的文字語法。 這意味着諸如bytes('Hello world', 'ascii')
語句能夠簡單地表示爲b'Hello world'
。
generator_stop
:
將生成器函數內部使用的StopIteration
異常的使用替換爲RuntimeError
異常。
上面未說起的另外一個用途是__future__
語句還強制使用Python 2.1+解釋器,由於使用較舊的版本將引起運行時異常。
參考文獻: