Effective Python: 59 Specific Ways to Write Better Python¶
どうして読むか。¶
PythonのTipsを学ぶためにこの本を読む。Effectiveシリーズは他にもあるが、実際にプログラミングをする際に役立つ情報が盛りだくさんで読む価値がある。そこで、今までのプログラミングスタイルを見直す意味で、この本から様々な知識を吸収する。
本のあらすじ¶
Python的考え方¶
- 使っているバージョンを知れ
- PEP 8 のスタイルに従え
- bytes, str, unicode の違いを知れ
- 複雑な関数を書くより、ヘルパー関数を書け
- 文字列のスライスの仕方を知れ
- シングルスライスで, start, end, stride の使用を避けろ
- map や filter を使うより、リスト内包表記を使え
- リスト内包表記で二つの表記より多く使うな
- 大きな表記のためにジェネレーター表記を考えろ
- range より enumerate を好め
- 多数の要素を返したいとき、イテレーターを実行するためにzipを使え
- while loop や for のあとに else ブロックを使うな
- try/except/else/finally のそれぞれのブロックの利点を使え。
関数¶
- Noneを返すより,例外を返せ
- どのように変数スコープとクロージャが関係するか知れ
- リストを返す代わりに、ジェネレータを考えろ
- 引数をイテレートするとき、防御的になれ
- 可変配置引数を使って、視覚的なノイズを減らせ
- キーワード引数で付加的な振る舞いを提供しろ
- 動的なデフォルト引数を毒呈するために、None と Docstrings を使え
- キーワードだけの引数で明瞭にせよ
クラスと継承¶
- ディクショナリやタプルで記憶するより、ヘルパークラスを作れ
- クラスの代わりに、シンプルなインターフェスのための関数を用意しろ
- 一般的にオブジェクトを作るための多形は @classmethod を使え
- superで親クラスを初期化せよ
- Mix-in ユーティリティークラスのための複数継承を使え
- プライベート属性より、パブリック属性を好め
- カスタムコンテナ型のために、collections.abc を継承せよ
メタクラスとオブジェクトの性質¶
- Get や Set の代わりに、Plain属性を使え
- リファクタリング属性の代わりに、@propertyを考えろ
- 再利用できる @property メソッドのために記述子を使え
- みにくい属性のために __getattr__ や __getattribute__ や __setattr__ を使え
- メタクラスを持つサブクラスを確認せよ
- メタクラスを持つクラスの存在を登録せよ
- メタクラスを持つクラスの属性に注釈をつけよ
同時実行と並列¶
- 子プロセスを管理するために subprocess を使え
- 同時実行を避けるために、ブロッキングI/Oのためのスレッドを使え
- スレッド間におけるデータのアクセス競合を防ぐために Lock を使え
- スレッド間における仕事を管理するために Queue を使え
- たくさんの関数を同時に実行するために、コルーチンを考えろ
- 本当の並列化のために concurrent.futures を考えろ
組み込みモジュール¶
- functools.wraps でデコレーター関数を定義せよ
- 再利用可能な try/finally のために contextlib と with を考えろ
- pickle を copyreg で信頼性を保て
- local Clocksのための time より datetime を使え
- 組み込みのデータ構造やアルゴリズムを使え
- 最高精度のとき decimal を使え
- Community-built モジュールの見つけ方
コラボレーション¶
- すべての関数とクラスとモジュールにDocstringsを書け
- 安定したAPIを提供し、モジュールを構成するためにパッケージを使え
- APIからの呼ばれないために元となる例外を定義せよ
- 相互依存の解消の仕方
- 開発環境依存や独立性のために仮想環境を使え
プロダクション¶
- 開発環境を考えてモジュールのコードを考えよ。
- デバッグのアウトプットとして、reprを使え。
- unittestで全てをテストせよ。
- pdbを使った対話的なデバッグを考えよ。
- 最適化する前にプロファイリングしろ。
- メモリー使用量とメモリーリークを調べるにはtracemallocを使え。