パーフェクトPythonを読んだ

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

1冊で言語仕様から最新の技術までを網羅した内容。網羅的に解説されているだけでなく、各技術に関しては基本からしっかり解説し、必要な箇所では、技術の進歩によってブラックボックス化が進んだ、内部処理が裏で何をしているのかを掘り下げて解説してあるため、体系的に知りたい初心者はもちろん中級者にもお勧めの一冊です.最新のPython3.3に対応

Python 3系を意識しているとか、言語仕様や周辺ライブラリの紹介ってのもあるけど、なにより Pythonic な文化であるとか習慣であるとか、それこそ「Zen of Python」が日本語でここまで語られていることが貴重な書籍だと感じた。

以下は細々としたメモ。書き起こしてみたらだいぶ頭が弱い感じがする文章になってるけど、まあ、はい。

with と context manager について

with open() as f っていうのはもはやイディオムになってるんだけど、たとえば fabric での cd コマンドでも context manager を使ってたりする。内部的には __open__ __exit__ などを呼ぶことで状態を管理できるというのはなんとなく調べたときに知ってたけど、少し整理がついた。

mro と superclass

これはどの言語でもある話だろうけど、最近 Django の class base view が mixin しまくっててよくわからなかったので調べていた。そのときに「誰が親クラスなのか」「その関数は誰のものなのか」というのを探すとき、mro が役に立つ。

文字列とバイト列

たぶん Python を触るといやでも出くわすのがこれで、文字列だとおもったらバイト列で UTF-8 になってなくて UnicodeDecodeError とかはよくある。最近だと mesasge pack の話があったけど、マルチバイトなことを意識されてないコードとかわりとある。まあ実際 ascii(というか laten-1 ?) な文字列を扱う分にはたしかに不自由がない。文字の扱いについてやりだすとだいぶ面倒なので*1避けてたところあるけど、すこし整理がついた。

C拡張

たとえば PIL あたりとか cPickle とかだと C の拡張を使うことになるというのはいいけど、それが具体的にどうやってるのかを知れて「へー」と思った。

nonlocal とクロージャ

JS だとよくあるクロージャを Python でやるとき、nonlocal で一番近い変数を探しにいくところでつかえるというのはちょっとおもしろかった。ただ、それが Python としてどう使えるのかはよくわからないけれど。

proprety アクセス

@property や @property.setter みたいな話。前 Python/Django の property をどう扱えばいいかモヒカンさんに相談した話 - AtAsAtAmAtArA というのをかいたとき「とりあえず関数に倒しておくのが無難。でも状態が変わってないのならプロパティと明示してもいいんじゃないの」とあった。たぶん JavaScript においてのプロパティって話と、そもそも C みたいにプロパティアクセスがないという考え方を知らなかったので*2これもすこし整理がついた。

以上

たぶん最速文法的なところだったらウェブのチュートリアルをやればいいと思う。本当に公式のチュートリアルは充実していて、あれでだいたい使えるようになるとは思う。でもそうじゃなくて、これから Python を本格的につかいたい、より Python らしいコードをかきたい人にいいと感じた。個人的には文化や慣習、Zen of Python なところをこうした形で伝えてくれるのはわりとうれしい。自分の場合たまたま Python な会社でそういう環境だったからある程度知れたけど、きっとそういう環境であるところは少ない*3

*1:UTF-16UTF-7であるとか、ではEUC-JPであるとかの違いがあることを知ってても、じゃあ Python 的に内部的にどこまでやってるかを知るのはいまはだるい

*2:そこらへんは C を軽くさわったときや Obj-C についてすこしかじったとき少し脳内で整理がついた

*3:とはいえ、自分もPEP8には完全には従ってなかったりはする。具体的には80文字折り返し。PyPiになにかをあげたこともないし