2012-09-19 26 views
7

Python 2.xでは、2つの整数を整数で返します。あなたは整数の除算を行うために//の代わり/を使用する必要があり、importシンボルをインポートした後、__future__からシンボルを削除/アンインストールするにはどうしたらいいですか?

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

:ただし、場合あなたはfloat値を取得することができます

from ___future___ import division 

を使用しています。 が再び整数除算を行うように、importを元に戻すにはどうすればよいですか?

from __future__ import division 
print(1/2) 

その後、あなたは別のファイルでそれをロードします:あなたはexample.pyとしてこのファイルを持っている場合たとえば、よう

+2

なぜあなたはそれをしたいですか? –

答えて

12

__future__インポートは特別で、元に戻すことはできません。彼らの行動を読み取ることができますhere。ここで

は、いくつかの関連する部分です:

将来の文は、コンパイル時に認識され、特別に扱われる:コア構築物のセマンティクスの変更は、多くの場合、異なるコードを生成することで実現されています。新しい機能が新しい互換性のない構文(新しい予約語など)を導入する場合もあります。この場合、コンパイラはモジュールを別の方法で解析する必要があります。このような決定は、実行時まで延期することはできません。
...
インタラクティブなインタプリタのプロンプトでタイプされた将来のステートメントは、残りのインタープリタセッションで有効になります。

__future__ステートメントは実行時ではなくコンパイル時に処理されるため、変更された動作を元に戻す実行時メソッドはありません。

通常のモジュールでは、名前空間からインポートしたものを削除し、sys.modulesでそのインポートのエントリを削除することで、モジュールを削除またはインポート解除できます(この2番目の部分は使用例によっては必要ありません。モジュールを再度インポートする場合は、モジュールの再ロードを強制します)。

+0

+1(この問題を説明する)とBrendan Long's(OPが実際にやりたいことをどのようにして行うことができるか説明しています)。 – abarnert

+1

拡張モジュール(_i.e._ Cのようなコンパイル言語で書かれたもの)は、インポート時にインタープリタのアドレス空間に統合されているため、アンロードできないことにも注意してください。 – holdenweb

4

importステートメントは、あなたがインポートファイルにローカルなもの

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

誰かが未来分裂を "取り除く"ことを望む理由の一つは単体テストです。私は除算演算子をオーバーロードしていて、Python 2でシングルスラッシュの動作を検証したいと思います。私は '__div __()'を直接呼び出すことができました。あなたの答えはもっと良い解決策かもしれません。別のソースファイルでシングルスラッシュでテストします。 –

関連する問題