2016-11-04 266 views
1

正如另一篇文章(https://stackoverflow.com/a/7075121/2706606)所解釋的那樣,在python中你可以從未來導入東西。python中只有一個「未來」的宇宙嗎?

例如2/4評估爲0(因爲它是一個整數除法)。

>>>print 2/4 
0 

但是如果你從未來導入「師」,其值爲0.5

>>> from __future__ import division 
>>> print 2/4 
0.5 

我從鏈接後不解的是,解析器不同的解析代碼,當您使用未來的進口。

而我的問題是,是否只有一個單一的,獨特的「未來」環境,所有這些未來的進口是從哪裏取得的?

我們如何保證將來的導入將與未來版本的python編譯器向前兼容?

是否有可能在「更遙遠的將來」2/4會評估其他價值?

+0

'__future__'僅在Python 2中使用,它幾乎死亡。將來沒有人會需要這個。 – furas

+0

是的。未來的環境被稱爲Python 3. –

+2

@furas:絕對不是。它現在在Py3中用於新事物,用於'generator_stop'([ref](https://docs.python.org/3/library/__future__.html))。儘管未來一旦到來,進口就不會做任何事情;它們被識別,但被忽略(因爲默認語法已經包含了它們)。如果你在你的Python版本中導入了一些還不存在的東西(例如在2.4中導入了'with_statement'),你會得到一個異常,讓你知道代碼與舊版本的Python不兼容。 – ShadowRanger

回答

1

如果您查看導入__future__,有一個名爲all_feature_names的列表,您可以使用它查看Python解釋器可用的功能。

import __future__ 
print(__future__.all_feature_names) 

在我的機器上,哪一個會在Python 2.7.12上返回以下內容。

['nested_scopes', 'generators', 'division', 'absolute_import', 
'with_statement', 'print_function', 'unicode_literals'] 

並與Python 3.5.2。

['nested_scopes', 'generators', 'division', 'absolute_import', 
'with_statement', 'print_function', 'unicode_literals', 
'barry_as_FLUFL', 'generator_stop'] 

然而有不能保證你正在運行將具有相同的功能可用,進口可能無法在一些實現甚至還存在,但假設功能是可用的Python解釋器的實現應該保持不變,只要它是根據PEP(例如PEP-0238)實現的,大多數Python解釋器都應該這樣做。

+1

爲了記錄,'from __future__ import barry_as_FLUFL' ['best](http://stackoverflow.com/a/4007310/364696)'__future__'導入。 :-) – ShadowRanger

+0

@ShadowRanger怎麼樣'from __future__ import braces' – abukaj

2

來自未來的特徵不會改變意義。這是保證from __future__ import x有以下三種行爲:

  1. 在一個版本的Python定義未來的行爲之前,拋出一個異常指示代碼不兼容
  2. 在一個Python版本的行爲變得之前在默認情況下,它使行爲
  3. 在一個Python版本的行爲變得之後,默認情況下,進口是公認的,但忽略

他們不會重用一個名字的意思是別的東西以後(因爲會vi提出了#3的「認可但忽視」規則)。如果他們決定再次更改division,則需要使用新名稱,例如爲了使其截至零分而不是分區劃分,他們可能會導入一個名爲truncating_division的導入__future__。但他們不會刪除division,永遠,只要Python的存在,他們也將改變含義,:

無特徵描述將永遠不會從__future__刪除。