2系と3系の違い | Python-izm

2系と3系の違い

Pythonではバージョン2系3系との間に互換性がありません。ソースコードの書き方に違いがあるため、2系のインタプリタでは動作していたスクリプトが、3系のインタプリタでは動作しない可能性があります(逆のケースあります)。このあたりも交えてバージョン選定を行う上での注意点も簡単にまとめておきます。

対応ライブラリの数

2017年現在、かなり改善していますが対応ライブラリの数はまだ2系の方が多いようです。3系で開発を始めたものの、目的の機能を実装するために利用しようとしたライブラリが2系にしか対応していない、というような状況にならないよう事前に調べておく必要があります。そういった事に陥らないように、2系を選択して開発を行うケースもあるようですが、標準ライブラリのみで開発可能なプログラムであれば、最新の3系を利用して開発を行うのが良いでしょう。

パッケージの再構成

標準ライブラリのurllibxmlrpclib等のパッケージが再構成されています。モジュール名そのものが変更されていたり、階層が移動されているケースがあるので、該当するモジュールのインポートを行う場合は注意しなければなりません。

print文の関数化

3系からprintが関数化されたので、2系の書き方と比較してみます。以降のソースコードは、書き方に相違はあれど出力結果は同じものとなります。

Python 2系

print 'python-izm.com'

Python 3系

print('python-izm.com')

実行結果

python-izm.com

Python 2系

print 'python' ,
print '-' ,
print 'izm' ,
print 'com'

Python 3系

print('python', end=' ')
print('-', end=' ')
print('izm', end=' ')
print('com')

endはデフォルトで改行コードが入ります)

実行結果

python - izm com

Python 2系

f_obj = open('test.txt', 'w')

print >> f_obj , 'python-izm.com'

Python 3系

f_obj = open('test.txt', 'w')

print('python-izm.com', file=f_obj)

実行結果

python-izm.com

※test.txtへ出力されます。

文字列の型

文字列の型がunicodeへ統一されました。まずは2系です。文字列の型はunicodestrの2種類が存在しています。

Python 2系

# -*- coding: utf-8 -*- 

test_str_1 = 'python-izm'
test_str_2 = 'パイソンイズム'
test_str_3 = u'パイソンイズム'

print type(test_str_1)
print type(test_str_2)
print type(test_str_3)
print '-----------------------'
print test_str_1
print test_str_2
print test_str_3

実行結果

<type 'str'>
<type 'str'>
<type 'unicode'>
-----------------------
python-izm
(文字化け)
パイソンイズム

次の3系はunicode型のみです。最新のバージョンでは文字列へuが付与されていてもエラーにはならなくなりました。

Python 3系

test_str_1 = 'python-izm'
test_str_2 = 'パイソンイズム'
test_str_3 = u'パイソンイズム'

print(type(test_str_1))
print(type(test_str_2))
print(type(test_str_3))
print('-----------------------')
print(test_str_1)
print(test_str_2)
print(test_str_3)

実行結果

<class 'str'>
<class 'str'>
<class 'str'>
-----------------------
python-izm
パイソンイズム
パイソンイズム

typeでの結果はstrですが内部的にはunicodeです。あえて分ける必要が無くなったのでstrへ統合されました。

変換ツール

Pythonでは2系のソースコードを3系へ変換するツールが用意されています。これについては2系から3系への変換ツール (2to3)で解説しています。