nekoTheShadow’s diary

IT業界の片隅でひっそり生きるシステムエンジニアです(´・ω・`)

Brett Slatkin『Effective Python: Pythonプログラムを改良する59項目』(オライリージャパン )を読んだ

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

総論に移る前にまずは各論から。読書メモからいくつか抜粋&清書します。本当はもっとあるのですが、書き出すときりがないので、控えめにしておきます(´・ω・`)

  • 項目20: Pythonではデフォルト引数としてNoneを指定することが多々あるのですが、これはデフォルト引数の評価が関数が定義されたときに1度だけ行われるから。たとえばhello(msg, time=datetime.now())としたくなりますが、これはNG。
  • 項目21: Python3からはキーワード引数を強制する方法があるようです。たとえばdef hello(msg, *, time=None)とすると、たとえばhello('world', time=datetime.now)というようにキーワードをつけて関数呼び出しをしないとエラーになります。
  • 項目26: Pythonは多重継承を許可していることはよく知られていますが、本書はmixin用途にのみ、多重継承を利用すべきとしています。わかりやすい戦略ですね(´・ω・`)
  • 項目28: collections.abcの存在自体は知っていたのですが、本章を読んで初めてその内容を理解しました(´・ω・`) JavaでいうところのCollectioIteratableに近い機能を持っているようです。
  • 第4章: 「メタクラスと属性」というタイトルからもわかる通り、本章はまるっとメタプログラミングについて書かれています。黒魔術志向(?)のRubyをよく知っている身としては「Pythonのリフレクションなんてたかが知れている」と勝手に思い込んでいたのですが、意外にもしっかりとサポートされています。自分がこの手の機能を利用するかどうかは正直微妙ですが、OSSのコードリーディングなどをする場合には役立ちそう。個人的には項目32、すなわち__getattr____getattribute__に関する部分に関心を持ちました。いわゆるフックメソッドですね。
  • 第5章: この章はいわゆるマルチスレッドプログラミングについて書かれています。そもそもPythonでマルチスレッドプログラミングができるということを知らなかったので、素直に勉強になったというのが第一印象です。しかもかなり書きやすそう(´・ω・`) 自分でマルチスレッドプログラミングをごりごり書くことは少ないとは思いますが、知っ ていて損はないはず。 -項目55,項目57,項目58,項目59: デバッグやパフォーマンスチューニングについて書かれた項目です。Pythonでアプリケーションを作ったことがないので、何とも言えないのですが、大変便利そうではあります。この手の機能を標準で用意してくれているというのが良いですね。お仕事で使う機会があればいいな――ないと思うけれど(´・ω・`)

Effectiveシリーズなので説明不要かもしれませんが、本書はプログラミング言語Pythonのベストプラクティス集です。そもそもPythonらしいコーディングとはどのようなものでしょうか? まずPython特有の機能、あるいはPythonにおいて手厚くサポートされている機能を多用することがあげられるはずです。たとえば第1章。13の項目から構成される、その名もずばり「Python流思考」というタイトルのこの章ではイテレータを利用することが何度も強調されます。Pythonに慣れていないプログラマだとlistやsetを多用しがちですが、イテレータを使うほうがPythonicとされており、パフォーマンスの面でもイテレータを利用する側に軍配が上がります。この「イテレータの利用」は一例にしかすぎませんが、本書がそのようなPythonらしさに関して、非常に注意を払っていることは明らかであり、本書はPythonicへの特急切符となりうると思います。

面白いのは、Pythonらしさの追求において「プログラミング一般において、よいとされる原則」に触れだしているところ。

  • 項目14: Noneを返すよりは例外を選ぶ
  • 項目49: すべての関数、クラス、モジュールについてドキュメンテーション文字列を書く
  • 項目56: unittestですべてをテストする

などなど。これらはPythonでなくても、現代的なプログラミングにおいて基本的には推奨されている原則です。Pythonは「書きやすく読みやすい」言語を目指して設計されたと聞きます。したがってPythonの敷いたレールにのっかれば、おのずと現代的なプログラミングについても学べてしまうのかもしれません。

さてその内容についてはまったく文句のない本書ですが、あえて文句をつけるならば翻訳の質。プログラマなら英語を読むべきとか、技術書翻訳に高い品質を求めるほうが間違っているとか、いろいろご意見はあると思いますが、本書の翻訳はお世辞にもレベルが高いとは言えない。どことなく機械翻訳的というか、逐語訳的というか。ただしそもそもの文章量が少ないうえに、サンプルコードが充実しているので、「まったくもって意味が分からない」ということはありません。ちょっと気にかかるという程度の問題で、本書の評価を極端に下げるほどのものではないとは思います。