2012-09-19 58 views
7

在python 2.x中,將兩個整數相除會返回一個整數。但是,如果你使用如何在導入後從__future__中刪除/取消導入符號?

from ___future___ import division 

你可以得到一個浮點值:

>>> 3/2 
1 
>>> from __future__ import division 
>>> 3/2 
1.5 
>>> 
>>> 
>>> 3//2 
1 
>>> 4/3 
1.3333333333333333 
>>> 

import之後,你必須使用//,而不是/做整數除法。我如何恢復import以便/再次進行整數除法?

+2

你爲什麼要這麼做? –

回答

12

__future__進口是特殊的,不能撤消。你可以閱讀他們的行爲here

這裏有幾個相關部分:

未來的利潤表和在編譯時經過特殊處理:更改核心結構的語義往往是由不同的生成代碼實現。甚至可能出現新功能引入了新的不兼容語法(例如新的保留字)的情況,在這種情況下,編譯器可能需要以不同方式解析模塊。這些決定只有在運行時才能推出。
...
在交互式解釋器提示符下鍵入的將來語句將對解釋器會話的其餘部分生效。

由於__future__語句是在編譯時處理的,而不是運行時,所以沒有用於恢復已更改行爲的運行時方法。

對於普通模塊,您可以刪除或取消導入模塊,方法是刪除從名稱空間導入的任何內容,並刪除sys.modules中該導入的條目(根據用例,此第二部分可能不是必需的,它只是如果再次導入,則強制重新加載模塊)。

+0

+1這個答案(這解釋了這個問題)和Brendan Long的(這解釋了OP如何實際執行他想做的事情)。 – abarnert

+1

還請注意,擴展模塊(_i.e._以C編譯語言編寫的那些模塊)無法卸載,因爲它們在導入時集成到解釋器的地址空間中。 – holdenweb

4

import語句是本地的,你導入的文件,因此,例如,如果你有這樣的文件example.py

from __future__ import division 
print(1/2) 

然後您加載它在另一個文件:

import example # prints 0.5 because `division` is imported in example.py 
print(1/2) # prints 0 because `division` is not imported in this file 

所以如果您想要一個僅用於您的某些代碼的導入,請將該代碼放在單獨的文件中。

在這種情況下,我不確定它有幫助。當你需要整數除法時,爲什麼不使用//

+0

答案爲什麼有人想要「unimport」未來分裂的一個答案是單元測試。我超載了除法運算符,並希望驗證Python 2中的單斜槓行爲。我可以直接調用'__div __()'。您的答案可能是更好的解決方案:在不同的源文件中使用單斜槓進行測試。 –