インデントとブロック

林です。

少し古い話になるが昨年末からある書籍を使ってChainerの独学を進めていた(現在は諸事情で中断している)。

ChainerはPython2.xおよび3.x系から利用できるオープンソースのソフトウェアライブラリであるため、Chainer を独習する場合、Pythonを使わざるを得なくなるわけだが、このPythonというプログラミング言語がなかなか取っ付き難い。

もう少し正確に言うと、Pythonとは、「ALGOL系のプログラミング言語(C、C++、C#、Java、Pascal等)に慣れ親しんできたプログラマにとって、取っ付き難いプログラミング言語」なのである。

色々と取っ付き難いところはあるのだが、一番取っ付き難いのはブロックの定義である。

ALGOL系のプログラミング言語では、ブロックの開始と終了を示すキーワードに挟まれたコードがブロックとなる。

以下に、if文を例にブロックを説明する。

例えば、Javaにおけるif文のブロックは下記のとおり{から}までに書かれたコードがその範囲となり、

 

 

 

 

 

 

 

 

 

Visual Basicにおけるif文のブロックは下記のとおりThenからEnd Ifまでに書かれたコードがその範囲となる。

 

 

 

 

 

 

 

これがPythonでは、同じ幅でインデントされたコードがブロックとなる。

 

 

 

 

 

 

つまり、Pythonにおけるif文のブロックとは同じ幅でインデントされコードがその範囲となるのである。

このブロックの開始と終了を示すキーワードが無いという、たったそれだけのことがALGOL系の言語に慣れ親しんだプログラマにとっては耐え難い苦痛になる。

例えるなら、開けたドアを閉めずに部屋の中に入ってきている無作法者のように感じられるのである。

Pythonに対し、このような感想を持つのは筆者だけかどうか不安だったのだが、最近、前の勤務先の先輩エンジニア達と会って話す機会が多いので彼らとPython談義をしてみたところ、彼らも筆者と同じ感想を持っていた。

確かに、ALGOL系の言語でも同じブロックのインデント幅を揃えないことはないので(仮に揃えなかった場合、後々のコードレビューで他のプロジェクトメンバからボコボコにされるのは必至だ)、それならば「ブロックの開始と終了を示すキーワードは使わず、同じインデント幅のコードを同じブロックにしよう」というPythonの文法は合理的であり、プログラムのステップ数も減る。

しかし、それは伝統を捨ててまで取り入れるほど価値のあることなのだろうか?

Pythonという言語はちょっと見た感じではALGOL系の言語に似ているが、実は全然そうではなく、むしろALGOL系の言語が創り上げてきた伝統を破壊する性質を持つ。

ことほど左様にPythonとは、ALGOL系の言語に慣れ親しんだプログラマには極めて取っ付き難い言語なのである。