2010-06-02

エキスパート Python プログラミング




アスキーメディアアートより、「エキスパート Python プログラミング」の見本本(みほんぼん)を頂きました。Python でひととおりコードが書けるようになって、次にステップアップしたいけど、これからどうしよう、みたいな人にオススメだと思います。即物的な知識、たとえばライブラリやフレームワーク固有の知識ではなくて、もうちょっとこう一般的な知識として身につける、とか。



たとえば、4章「良い名前を選ぶ」の132ページ。PEP 8 に則って、Python では、プライベートなメソッド、関数、変数には _lowercase をつけましょうという慣例があります。で、__init__ とか __eq__ みたいに、アンダースコアが2つつくメソッドもあるわけです。Python では、__my_method みたいな命名をすることは文法的には禁じられていません。しかしながら、これはなかなかに落とし穴があります。



>>> class Foo:
... def _hoge(self):
... print "_"
... def __fuga(self):
... print "*******"
... def hello(self):
... self._hoge()
... self.__fuga()
...
>>> f = Foo()
>>> f._hoge()
_
>>> f.__fuga()
Traceback (most recent call last):
File "<stdin>", line 1, in
AttributeError: Foo instance has no attribute '__fuga'
>>> f.hello()
_
*******
>>> Foo.__dict__
{'__module__': '__main__', '__doc__': None, '_Foo__fuga': <function __fuga="" at="" 0xc5730="">, '_hoge': <function _hoge="" at="" 0xc57b0="">, 'hello': <function hello="" at="" 0xc5630="">}


アンダースコアをひとつ接頭したメソッドには外部からアクセスできますが、アンダースコアをふたつ接頭したメソッドにはアクセスできません。この動作だけ見ると、プライベートメソッドには、アンダースコアをふたつ接頭するのかなぁと思ってしまいます。そう思っていた時期が私にもありました。



けど、違うんですね。そういう情報って、PEP とか dev のメーリングリストを読めば分かるのですが、情報が分散していますし、なかなか背景となる理由も分かりにくいです。



そういうところを抑えたのが、本書です。他にもテスト、文書系のアプリやモジュール、パッケージの書き方など、ちょっと気合いの入った開発に役立つ知識がいっぱいです。Code Complete や Pragmatic Programmer とかに近い内容です。



ちなみに上記については「Python には動作を強制するようなプライベートメソッドはない。アンスコ2つの挙動は別の理由」です。