2011-08-16 36 views
334

包括我在內的人都知道Python中有一種叫做__future__的東西,它出現在我閱讀的很多模塊中。像我這樣沉悶的人不知道爲什麼它在那裏,以及如何/何時使用它,即使在閱讀the Python's __future__ doc之後。什麼是__future__在Python中用於和如何/何時使用它,以及它是如何工作的

那麼用實例來說明一下嗎?

我很快就得到了一些答案,就基本用法而言,這看起來都是正確的。

然而,也爲進一步瞭解如何__future__作品:

我才意識到這是困惑我一個關鍵的事情,當我試圖去了解它,那就是當前的Python版本如何包括一些將被釋放未來的發佈? 以及當前python版本如何在未來的python版本中使用新功能編譯成功?

所以,現在我想,目前的版本已經打​​包了一些潛在的功能,將包括在未來的版本 - 這是正確的嗎?但功能只有__future__,這是因爲它不成爲標準 - 我是對的嗎?

+1

這是未來聲明的原始提案。我發現它有助於理解爲什麼它在那裏,所以何時以及如何使用它自然遵循。 https://www.python.org/dev/peps/pep-0236/ –

+6

它基本上相當於[「我想你還沒有準備好,但你的孩子會喜歡它」](https:// www.youtube.com/watch?v=6XwNibBpDYU)。 –

回答

191

隨着__future__模塊的納入,您可以慢慢適應不兼容的變化或者引入新關鍵字的類似變化。

例如,對於使用上下文管理器,您必須在0123中執行from __future__ import with_statement,因爲with關鍵字是新的,不應再作爲變量名稱使用。爲了能夠使用名爲with的變量的程序,需要上述導入語句。

另一個例子是

from __future__ import division 
print 8/7 # prints 1.1428571428571428 
print 8//7 # prints 1 

沒有__future__的東西,無論是print報表將打印1

內部的差異是沒有那個導入,/被映射到__div__()方法,而使用它,使用__truediv__()。 (在任何情況下,//調用__floordiv__()。)

一個propos printprint成爲3.X的功能,失去了它的特殊屬性作爲關鍵字。所以這是相反的。

>>> print 

>>> from __future__ import print_function 
>>> print 
<built-in function print> 
>>> 
+80

不要忘記'from __future__ import braces':p – MatToufoutu

+1

@MatToufoutu:LMAO!我怎麼不知道這個? –

+0

@MatTouFoutu這很有趣......但嚴重的是,當你在編輯使用空格的代碼時,你會做什麼,但你更像是一個選項卡?有時候,當我將一個縮進更改爲一個選項卡時,我得到了一個錯誤,然後我必須使用相同的製表符數量更改之前的所有縮進......令人沮喪的... –

114

當你

from __future__ import whatever 

你沒有實際使用import聲明,而是一個future statement。您正在閱讀錯誤的文檔,因爲您實際上並未導入該模塊。

未來的聲明很特別 - 它們改變了你的Python模塊的解析方式,這就是爲什麼必須是位於文件的頂部。它們賦予新的或不同的含義 - 意思是文件中的文字或符號。來自文檔:

未來的聲明是編譯器的一個指令,應該使用語法或語義來編譯特定模塊,這些語法或語義將在指定的未來版本的Python中提供。未來的聲明旨在簡化向未來版本的Python的遷移,從而引入對語言不兼容的更改。它允許在功能成爲標準的版本之前,在每個模塊的基礎上使用新功能。

如果你真的要導入的__future__模塊,只是做

import __future__ 

,然後訪問它像往常一樣。

+1

從技術上講,它也是一個導入語句,因爲相關名稱綁定到局部變量。 'from __future__ import print_function'都改變了'print'關鍵字的行爲,並且具有等同於'print_function = __import __(「__ future __」)的運行時影響。print_function' – ppperry

26

它可以用於使用功能,這些功能將在具有較舊版本的Python的同時出現在較新版本中。

例如

>>> from __future__ import print_function 

將允許您使用print作爲一個函數:

>>> print('# of entries', len(dictionary), file=sys.stderr) 
+0

示例我正在尋找! – Crt

12

或者是像說:「由於這是蟒蛇V2.7,使用不同的‘打印’函數在Python 3.0中添加後也被添加到python v2.7中。所以我的'print'將不再是語句(例如print「message」),而是函數(例如print(「message」,options) 。當我的代碼在python 3中運行時,'print'不會中斷。「

from __future__ import print_function 

print_statement是包含新的實施「印刷」的按照它是如何在Python V3行爲的模塊。

這有更多的解釋:http://python3porting.com/noconv.html

+2

我想你的意思是說''from __future__ import print_function'' – antimatter

+0

@gyeh也許這個答案只是顯示未來的Python 3'導入'代碼(對於Python 4未來的兼容性):} – user2864740

+0

我已經更新了上面的代碼來說' print_function'這是正確的。 – Praym

71

__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) 
+7

最清晰的答案imo – MattClimbs

+1

因此,基於變量的發佈版本,如果您的解釋程序使用比指示版本晚的版本,那麼'import __future__ xyz'是不可操作的? – Ray

+0

這與瀏覽器世界中的polyfill有點類似 – cs01

2

其中一個用途,我認爲是非常有用的來自__future__模塊的print_function

在Python 2.7中,我希望將不同打印語句的字符打印在同一行上,而不使用空格。

它可以在最後使用逗號(「,」)來完成,但它也會附加額外的空間。 上面的語句爲當用於

from __future__ import print_function 
... 
print (v_num,end="") 
... 

這將從每次迭代在打印一行的v_num值而不空格。

-3

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: 
* 
** 
*** 
**** 

如果我們使用普通打印功能,我們將無法達到相同的輸出,因爲打印()帶有一個額外的換行符。所以每當內循環執行時,它都會將*打印到下一行。

相關問題