Pythonの__future__

この前amachangPythonの「互換性のなくなる仕様変更」の導入のされ方について聞かれて後で説明すると言ったまま忘れていたのを思い出しました。Pythonでは互換性のなくなるような仕様変更は「実装できたら即投入」じゃなくて、一度「明示的に指定すると使える」というフェーズにし、次のバージョンアップで「明示的に指定しなくても使える&明示的に指定したコードもエラーを出さない」というフェーズにする、という段階的投入を行ないます。それに使われるのが__future__モジュールです。

たとえば1 / 2は現状では0になります。整除ですね。でもfrom __future__ import divisionするとJavaScriptと同じ「整数同士の割り算でも割りきれない場合は実数にする」というモードに切り替わります。

>>> 1 / 2
0
>>> from __future__ import division
>>> 1 / 2
0.5

他にも、たとえば現在アルファ版が公開されているPython2.6ではfrom __future__ import bracesでブロックの表現方法を切り替えることができます。

>>> primes = []
>>> for n in range(2, 100):
	for p in primes:
		if n % p == 0:
			break
	else:
		primes.append(n)

		
>>> primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>> from __future__ import braces
>>> primes = []
>>> for n in range(2, 100){
	for p in primes{
		if n % p == 0{
			break
		}
	}else{
		primes.append(n)
	}
}		
>>> primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

もっとも、実装はしたものの「デフォルトはインデント」というのは譲れないみたいですね。Python3000でもそこらへんは変更しない、って話がPEP 3099 -- Things that will Not Change in Python 3000に書いてあります。

        • -

便利ですね。もちろん四月馬鹿的な意味で。

あわせてよみたい:(訂正)Pythonの__future__ - 西尾泰和のはてなダイアリー