(訂正)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.