Python 2の「例外」は、仕様の中でもあいまいさや機能の重複があると、議論の的になってきた仕様の1つです。
例えば、Python 2でOSError例外だけを捕まえるためは、以下のようなコードを書きます。コンマの後にあるeという変数には、例外オブジェクトが代入されます。
try: # 例外を捕まえる処理 except OSError, e: # 例外発生時の処理
1つのexcept文で複数の例外を受け取りたいときは以下のようにします。コンマが例外の種類と例外を受け取るオブジェクトの区切りに使われているので使えず、例外を列記するには、以下のようにします。カッコの後のコンマを書き忘れてしまいそうで、なんだか覚えづらい記法です。
: except (OSError, IOError), e: # 例外発生時の処理
Python 3で例外を受け取る場合は、コンマの変わりにキーワード「as」を使って以下のように書きます。Python 2.6以上でもこの文法が利用できます。
except OSError as e:
複数の例外を1つのexcept文で受けたいときには、「except (OSError, IOError) as e」のように例外をカッコで囲んで列挙します。
例外を発生するときには、以下の記法のみが利用可能です。ちょうど、例外クラスのインスタンスを作って例外を投げているような表記で、明解な表記といえます。
raise OSError('foobarbaz')
Python 2までは、「raise OSError, 'foobarbaz'」という記法が利用できましたが、Python 3では使えなくなっています。ここでも、より明解な文法のみが採用され、古く曖昧に見える文法が取り除かれています。
PythonにはPEP 8という変数などの命名ルールを決めた文書があります。この文書には、モジュール名は英小文字で構成することとあります。このように命名規則を設けることで、プログラム中でどんな種類のオブジェクトを扱っているのかが分かりやすくなります。
ところで、Python 2の標準ライブラリの中には、QueueやConfigParserなど大文字で始まるものがいくつかありました。大文字で始まる命名規則はクラスに採用されているため、紛らわしいという議論がありました。
また、urllibとurllib2など紛らわしい名前のモジュールが混在しているといった問題もありました。どのモジュールも、後方互換性を崩すという理由から、名前が修正されずに残っていたのです。
Python 3では、モジュールの名称変更や統合が行われます。
Python 3では以下のモジュールが廃止されています。
また、Python 3では以下のモジュールの配置が変更されています。
Python 3では以下のモジュールの名前が変更されています。
なお、Python 3では、モジュールの名称変更や統廃合だけでなく、multiprocessやioなど魅力的なモジュールも多く追加されています。
Pythonは、もともとシンプルで一貫性のある仕様を目指して作られたプログラミング言語です。しかし、開発初期のデザインミスやPythonを巡る環境の変化から、細かな「ほころび」があったのも事実です。これまでは後方互換性を守るという理由から、直すべきと分かっていながら直せなかった仕様が、Python 3.0を期に多く修正されています。
Python 3.0の変更点を注意深く見ていくと、このような仕様変更の周辺に、多くの機能追加があることもよく分かります。組み込み型でいえば、set型にリテラルが追加されたり、リスト内包表記と同じ働きをもつ辞書内包表記、set内包表記という文法が追加されたりしています。
ほころびを修正しながら言語としての一貫性を増し、さらに便利な機能追加をするというのがPython 3の進化の方向性です。実際、Python 3.0を使ってみると、変更可能なbytes型を始めとして、とても便利な機能が多く搭載されていることに気付きます。
Webアプリケーションフレームワークなど、普段使っているライブラリやフレームワークがPython 3に対応し、Python 3をより広く活用できる日が来るのを待ち遠しく思います。
Copyright © ITmedia, Inc. All Rights Reserved.