(訂正)Pythonの__future__

昨日、四月一日に公開したPythonの__future__には一部誤りがありましたので訂正してお詫びします。

まず以下の記述について:

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

これは本当です。Python2.5でも下の通りの挙動をします。

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

問題はここからです。

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

と書いていましたが、サンプルコードを実際に実行してみると **importの時点で** 構文エラー"not a chance"になります。

>>> from __future__ import braces
SyntaxError: not a chance (<pyshell#2>, line 1)

ちなみに存在しないfeatureをimportした場合は普通は「future feature *** is not defined」というエラーになります。

>>> from __future__ import hoge
SyntaxError: future feature hoge is not defined (<pyshell#5>, line 1)

実はbracesだけfuture.cのfuture_check_featuresという関数の中で下のように特別のエラーを出すように実装されているのです。

} else if (strcmp(feature, "braces") == 0) {
	PyErr_SetString(PyExc_SyntaxError,
			"not a chance");
	PyErr_SyntaxLocation(filename, s->lineno);
	return 0;

最後に、PEP3099について下のように書きました:

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

これは実際に読んでみればわかりますが「bracesは取り入れないよ。この件に関してはDo from __future__ import bracesすると明確な答えが返ってくるよ」と書いてあります。要するに「not a chance」(絶対にあり得ない)ということです。

No braces.

This is so obvious that it doesn't need a reference to a mailing list. Do from __future__ import braces to get a definitive answer on this subject.