__future__ モジュールについて
いきなり 3 系に移行するのはちょっと心配…という場合、まず2 系 + __future__ モジュールを使うのが良さそう。__future__ モジュールは Python 2 系用のモジュール。Python 3 系に実装されている Python 2 系 と互換性の無い機能をPython 2 系で使用できるようにする。
以下、__future__ モジュールに実装されている機能を利用しつつ、Python 3 系での大きな変更点を確認してゆく。
print_function
3系では print は文から関数 print()になった。また予約語からも削除された。
1 2 3 4 5 6 7 8 | |
2系で改行文字を出力しない場合は print "hoge", のように記述していたが、3系ではもっと汎用的に記述できる。end=''の''の部分を任意の文字列で置き換えられる。
1 2 3 | |
また、ファイルへの出力も引数で指定すれば可能。
1 2 3 4 | |
unicode_literals
Python 3 系では文字列は基本的にすべてユニコードとして扱う。日本語等の扱いが相当楽になる。u'日本語'と書いていたものは全て'日本語'と書けば良い。逆に以前の通常の文字列を取り扱いたい場合b'日本語'のようにb''の形で書く(byte列表現)。
1 2 3 4 5 6 7 8 9 | |
注意:
byte列表現を取り扱う際、インデックスの参照結果が2系と3系で異なる。詳しくはここを参照。
division
2系では割り算の演算子 / は小数点以下切り捨てだったが、3系では小数点以下をそのまま扱える。
切り捨てたい場合、新演算子の // を利用する。
1 2 3 4 5 6 7 8 | |
future_builtins
このモジュールは、Python 3 系 では異なった動作をする Python 2 系 のビルトイン名前空間に追加できない関数を提供する(future_builtins — Python 3 のビルトイン)。
- ascii(object)
- 引数で与えた値と等価なリテラル表記文字列を返す。つまり repr() と同じ値。Python 3 では、 repr() は表示可能なUnicode文字をエスケープせずに返し、 ascii() はその文字列をバックスラッシュでエスケープする。repr() の代わりに利用することで、ASCII文字列を必要としていることを明示できる。
1 2 3 4 5 6 7 8 9 10 | |
- map(function, iterables, …)
- iterables の要素を引数として funtion を呼び出すイテレータを作成する。function が None の場合、引数のタプルを返す。itertools.imap() と同じ動作。
1 2 3 4 5 6 7 8 | |
- filter(function, iterable)
- function が True となる要素だけを返すイテレータを作成する。function が None の場合、値が真のものだけを返す。itertools.ifilter() と同じ動作。
1 2 3 4 5 6 7 8 | |
- zip(iterables, …)
- 各 iterable の要素をまとめるイテレータを作成する。itertools.izip() と同じ動作。
1 2 3 4 5 6 | |
hex(object)
- ビルトイン hex() と同じように動作するが、
__hex__()の代わりに、__index__()メソッドを利用して整数を取得し、それを16進数文字列に変換する。
- ビルトイン hex() と同じように動作するが、
oct(object)
- ビルトイン oct() と同じように動作するが、
__oct__()の代わりに、__index__()メソッドを利用して整数を取得し、それを16進数文字列に変換する。
- ビルトイン oct() と同じように動作するが、
absolute_import
Python 3 では相対インポートではなく、絶対インポート優先になる。標準モジュールと同名のモジュールがカレントディレクトリにある場合、Python 2 系ではカレントディレクトリのモジュールが優先されていたので、これを使うことで標準モジュールを意図せず上書きしてしまう可能性がなくなる。
以下のディレクトリ構成を仮定する。
1 2 3 4 5 6 7 8 9 10 | |
piyo.pyからhoge.pyとfoo.pyの相対インポートを明示的に行いたい場合、
1 2 3 | |
のようにする。
with_statement
with 構文はPython 2.6 以降ではデフォルトで有効。Python 2.5 を使っている場合にこれを import してやる必要がある。
以下のコードのようにファイル読み込みの際に with 構文を使うと、close()を自分で呼び出す必要がなく、ブロックを抜けると自動でclose()を呼ぶ。例外処理等を行いやすいので読み書きする際には with 構文を使うべき。
1 2 | |
with 構文についての細かい解説このページが詳しい。
nested_scopes
Python 2.0 から 2.1 でスコープルールに大きな変更点があった。2.1以降のバージョンを使っている場合問題になることはないので説明は略 (PEP 227)。
最後にまとめ
現状の2系最新版 Python 2.7 を使う場合、出来る限り __future__ モジュールを import しておいて3系の機能に今のうちから慣れておきましょう。
1 2 3 4 5 | |