Effective Python 読書ノート¶
いつの間にか Effective 本の Python モノが出版されていた。
未取得な必修事項がかなり残っていることを教えてくれた。私の場合は 4 章以降の知識がかなり危ない。
1 章 Python 流思考¶
スライスのときに
[0:i]とか[i:-1]とは書かずに[:i]とか[i:]と書くのを推奨。スライスの stride 機能は扱いが難しいので基本的には避ける。
rangeよりもenumerateを好むとあるが、言わんとすることに注意。リストを反復するときに添字が必要であれば、下のようにするなという意味だろう。どのようなときにもenumerateを使えと言っているのではない。for i in range(len(a)): handle(a[i])
2 章 関数¶
項目 14 で <
Noneを返すよりは例外を選ぶ> とある。これはもう当然だろう。高級な概念だが、closure とか
nonlocalとかを人に説明できるように理解しておきたい。__iter__の実装演習をしておきたい。キーワード専用引数のための構文が Python にはある(関数引数リスト内に単体の
*でそれを示す)。
3 章 クラスと継承¶
組み込みデコレーターの
@classmethodは「クラス全体」に効く。これはけっこう便利なので愛用している。普通の用途においては
super()は引数なしで OK だ。いつも派生クラスの__init__を書くときに「何だっけ」となるので、忘れないようにする。C++ とは事情が逆で、Python では private より public を好むようだ。これについて人に理由を説明できるようにしておきたい。
4 章 メタクラスと属性¶
これも C++ とは反対に getter や setter を提供する代わりに、剥き出しの属性を参照させるほうが良いとされる。おそらく理由も先程のものと似ているのだろう。
@propertyという組み込みデコレーターがあるので、一度定義した属性に対して後からどうとでもできる。__get__も__set__も使ったことがない。これも練習しよう。項目 32 で紹介されている
__getattr__,__getattribute__,__setattr__はまったく馴染みがない。実装の練習をしておきたい。metaclass=Metaと__new__に馴染みがないので、要演習。<メタクラスの__new__メソッドはclass文の本体全体が処理された後に実行される> (p. 108) そうだ。項目 34 で議論されている
register_classの技法は是非押さえたい。昔書いたコードではまさに手動でやっていた気がする。
5 章 並行性と並列性¶
この章の内容はどれもがほぼ未経験。致命的かもしれない。
モジュール
subprocessの提供する機能はかつてのpopen,popen2,os.exec*の系譜の最新進化形と捉えてよろしいか。GIL とは <マルチコア CPU でバイトコードを並列に実行することができない> ようにするPython のロックという位置づけ。
Lockは要演習。Queueは要演習。関数を並行実行する機能の枠組の一つに coroutines というものがある。これも演習したい。特に pdb でトレース実行してみたい。
さらに
concurrent.futuresなる新機能がある。
6 章 組み込みモジュール¶
@functools.wrapsは入れ子になった関数の内側の方を修飾するものなのか。既存の自作コードですぐにでも試せそうだ。@contextlib.contextmanagerを利用することで、自分でクラスを作って__enter__と__exit__を定義する手間が省けるかもしれない。これは既存の自作コードを改造するほうが高く付くので、残念だが見送ろう。これから作るものについては、当然デコレーターのほうを先に検討したい。モジュール
itertoolsについては、Python コードを書く機会に参照する。個人的には C++ で言うところの<algorithm>や、 C# で言うところの LINQ に相当する概念を提供するモジュールだと思っているので。
7 章 協働作業(コラボレーション)¶
<例外は定義している関数やクラスのインターフェースの一部です> まさにその通りだ。
仮想環境の話。今なら Anaconda/Miniconda ということだな。
8 章 本番運用準備¶
<
reprで返される文字列は正当な Python 式です> とある。それゆえ__repr__を実装するときには <オブジェクトを複製する Python 式を含んだ文字列を返す> ようにするべきだ。ただし「含んだ」というのがミソ。
関数
pdb.set_traceについては必修。いつでもスクリプトの先頭からデバッグ実行するには及ばない。tracemallocの練習をしたいが、何か良い練習台はないものか。もっと言えば、 Python でメモリーリークを引き起こすコードを書く方法とは何か。