Arantium Maestum

プログラミング、囲碁、読書の話題

PEP8を超えて

Python関連の映像では、私はRaymond HettingerとDavid Beazley*1のものが最も好きだ。

まず、どちらも非常に話が上手い。ユーモアを交え、あまり急かした感もなく、それでいて聞き手のことを考えた話の運びであるように思う。あと英語が訛っていないので聞きやすいということもある。

さらに、話している事柄がおもしろい。David Beazleyはgeneratorやconcurrency関連のかなり高等な話題が多い。必死に考えながら聞いていないと何を言っているか分からなくなることも多い。

David Beazleyのプレゼンで一番わけわからず、またわくわくしたのがcoroutineについて語っている以下のもの。

A Curious Course on Coroutines and Concurrency

Python coroutineを使えばtask schedulingができてOSが書ける!というお話。*2

対して、Raymond Hettingerはどちらかというと平易かつ簡単なPythonの使い方の説明が多い。itertoolscollectionsなどのstandard library developerという立場の人間のトーク内容としては少し意外かもしれない。ちゃんとイテレータプロトコルを利用しよう、コンテキスト・マネージャを使おう、ディクショナリーの機能をきっちり把握しよう、namedtupleで可読性を高めよう、などと、一つ一つの点ではあまり物凄いことは言っていない。

しかし、それで出来上がるPythonコードの美しさは素晴らしい。より可読性が高く、宣言的な*3記述は、「ぜひこんな風に書きたい!」と思わせるもの。簡単なIdiomをスマートに使いこなすことのほうが、複雑であまり知られていない言語機能を多数取り入れるよりも、Pythonの哲学に合致しているし、読みやすいし、そして多くの場合効率がいいというのは大切なことだ。

というわけで、最近のMontrealでのPyCon 2015のビデオがyoutubeに上がっていたので見てみた。

www.youtube.com

邦題としては「PEP8を超えてー読みやすく美しいコードを書くためのベストプラクティス」となるだろうか。

PEP8とはPythonのコーディングスタイル・ガイドライン。standard libraryはこのガイドラインに沿って書いてあり、

PEP8は素晴らしい*4が、Pythonコードの美しさというのはそのガイドラインに従うだけでは絶対に実現できない、というのが話の主眼。プレゼン中にEmacsでコードを書く・編集するという、かなり度胸のあるトーク方法だが、話の内容に大変うまくマッチしている。

23:30あたりからの「今までのPEP8エディットで可読性は上がったように見える。けど実はこれは全然Pythonicなコードじゃないんだ。なぜなら本当にPythonicな方法で上の処理を書くなら、こんな風になるはずだから」というくだりが特に感動的。try-except-else-finallyの代わりにカスタムで作ったcontext managergetSizeやindexを使ったループの代わりにAPI wrapperで__len____getitem__を実装してイテレータプロトコルsettergetterなどのメソッド@propertyを使ったattributeアクセスに交換、とすることで、20行ほどのロジックやエラーハンドリング、JavaAPIの入り混じったコードが見る見るうちに分割され、実際のビジネスロジックの部分は非常にきれいに3行で記述されるという結果になる。

小技の冴えで読みやすく宣言的なコードができる、というのを目の当たりにするのはかなり感動した。こういう動画を見ると、「どんな言語も慣れてしまえば大体同じ」という文言がいかに間違いかを実感する。*5

こういうPyConなどのテクニカルトークビデオが豊富に、そして即座に見れるというのは本当にいい時代だなぁ。

*1:Python Essential Referenceの作者

*2:それ以外の話題も入っているが

*3:とはいえ完全に関数的プログラミングに入り込むわけではないが

*4:一行79文字の制限以外は

*5:いや、もちろんある意味では同じと言えるのも事実だと認識しているが。とりあえずオブジェクト指向のサポートと関数が第一級のオブジェクトとして使えるなら、同じような使い方ができなくはない。JavaPythonを書くなどを気にしなければ・・・