Python 3以降との違いを調べていたときのメモ
Python 2.7でも試せるもの
以下にPython 2.7でimportをすればPython 3風に書けるものを列挙しておきます
from __future__ import division
Python 2.7では割り算「/」の結果は切り捨てでしたが、Python 3以降ではちゃんと小数点以下まで保持されるようになります
以前のような切り捨ての割り算は「//」演算子でできるようになります
>>> 3 / 2 1 >>> from __future__ import division >>> 3 / 2 1.5 >>> 3 // 2 1
from __future__ import print_function
Python3では「print」が関数になったので「print(何か)」のように書かないといけなくなります
また改行したくない場合には以下のように書けます
>>> from __future__ import print_function >>> print('Hello World', end='')
from __future__ import unicode_literals
Python 3では文字列は基本的にユニコードになります
Python 2.7では u'文字列' と書くことでユニコード文字列にしますが、Python 3以降はあるいはこのimportをするとuを書かないでも '文字列' と書くだけでユニコード文字列になります
通常の文字列(バイト文字列)は代わりに b'文字列' と書くようになります
>>> '文字列' '\x95\xb6\x8e\x9a\x97\xf1' >>> u'文字列' u'\u6587\u5b57\u5217' >>> from __future__ import unicode_literals >>> '文字列' u'\u6587\u5b57\u5217' >>> b'文字列' '\x95\xb6\x8e\x9a\x97\xf1'
Python 3では文字列関係の動作が他にも色々と変わってるので注意が必要です
これらはimportをしても変わらなかったりします
たとえば以下のような問題があります
Python 2 では、b'py'[1] は 'y' ですが、Python 3では 121 です。この相違については要素一つ分のサイズでスライスすることで避けられます。b'py'[1:2] とすると、Python 2 では 'y' となり、Python 3 では b'y' となります
http://docs.python.jp/3.3/howto/pyporting.html#bytes-literals
他にはopenしたファイルがバイト文字列を返すかユニコード文字列を返すかなどの違いもあります
from future_builtins import *
いくつかのビルトイン関数の動作が変わったり追加されたりします
たとえばmapやzip関数がイテレータを返すようになります
from __future__ import absolute_import
ちょっと詳細は理解していませんがimportが相対的ではなく絶対的(優先?)になります。
まとめ
というわけで色々と調べたんですが、importとかしても完全に互換にはならないみたいなので注意
どのバージョンのPythonが使われてるのが多いんですかね?