内容紹介
Pythonのベストプラクティスと最新コンセプトを伝授!
本書は、ベストセラーとなった『エキスパートPythonプログラミング 改訂2版』の内容を最新の状況・ツールに合わせて書き直した改訂版になります。本書を読むことで、先進的なPythonプログラマが日常的に使用している開発ノウハウを学ぶことができます。
◆Pythonプログラミングにおけるデザイン、コーディング、ディストリビューションのベストプラクティスを伝授します。
Pythonプログラマ必読と言われるベストセラーが、最新のPython環境に合わせて改訂されました。本書は、Pythonを使って仕事をしている開発者が普段どのようなツールやテクニックを用いて仕事をしているのか、また開発者が実際に現場で用いているベストプラクティスについて解説した書籍です。今回の改訂によって、新たにメタプログラミング、イベント駆動型プログラミング、型ヒントについての章が追加されました。
書誌情報
- 著者: Michał Jaworski, Tarek Ziadé(著), 稲田直哉, 芝田将, 渋川よしき, 清水川貴之, 森本哲也(訳)
- 発行日: 2021-07-30 (紙書籍版発行日: 2021-07-30)
- 最終更新日: 2021-07-30
- バージョン: 1.0.0
- ページ数: 616ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: アスキードワンゴ
対象読者
著者について
Michał Jaworski
Michał Jaworskiには10年におよぶPythonの経験があり、これまで複数の会社でさまざまな役割を経験してきました。その経験は、普通のフルスタック開発者からソフトウェアアーキテクトを経て、スタートアップにおけるエンジニアリングの統括責任者までに至ります。現在はShowpad社のシニアバックエンドエンジニアを務めています。彼は高性能な分散サービスの設計について、豊富な経験を持っています。さらに多くのPythonのオープンソースプロジェクトに対しても積極的にコントリビューターとして活動しています。
Tarek Ziadé
Tarek ZiadéはフランスのDijon近郊に住んでいるPython開発者です。Mozillaのサービスチームで10年働いた後、2021年1月からElasticで働いています。彼はフランスのPythonユーザーグループであるAfpyを創設し、Pythonに関する複数の書籍をフランス語と英語で執筆しています。コンピューターを使ってハッキングしたり家族とともに過ごす他にも、ジョギングとトランペットの演奏に情熱を注いでいます。
稲田直哉
KLab株式会社所属のOSS開発者。Python 3.6でdictの新実装を開発し、Pythonコア開発者になった。ブログはhttps://methane.hatenablog.jp。Twitterアカウントは@methane
芝田将
株式会社サイバーエージェントAI Lab所属。自動ハイパーパラメータ最適化ライブラリOptunaコミッター、Kubeflow/Katibレビューア。著書:『実践Django Pythonによる本格Webアプリケーション開発(2021年翔泳社)』GitHubアカウントは@c-bata、Twitter アカウントは@c_bata_
渋川よしき
三女の父。ホンダ→ DeNA→フューチャー。本章の11章でも紹介され、本書の翻訳でも活躍した、ドキュメントツールSphinxの普及と発展のためにSphinx-Users.jpの設立をするかたわら、拡張プラグインの開発、本体の機能拡張にも取り組んでいる。オライリージャパンから『Real World HTTP』、ラムダノートから『Goならわかるシステムプログラミング』を出版。ブログはhttp://blog.shibu.jp。Twitter アカウントは@shibu_jp
清水川貴之
株式会社ビープラウド所属。一般社団法人PyCon JP Association会計理事。2003年にZope2をきっかけにPythonを使い始め、それがオープンソース等のコミュニティ活動を始めるきっかけとなった。Python mini Hack-a-thonやSphinx-users.jpなどPython関連イベント運営のかたわら、カンファレンスや書籍、OSS開発を通じてPython技術情報を発信している。著書/訳書:『自走プログラマー(2020年技術評論社刊)』『Pythonプロフェッショナルプログラミング第3版(2018秀和システム刊)』『独学プログラマー(2018日経BP社刊)』『Sphinxをはじめよう第2版(2017 オライリージャパン刊)』サイトはhttp://清水川.jp/、Twitter アカウントは@shimizukawa
森本哲也
カザモリ合同会社所属。業務アプリケーションのサーバーサイド開発を経てインフラエンジニアに携わった後、独立して仕事をしていく方法を模索している。Pythonは普段使いのツールとして使いつつも業務ではJavaやGo言語といった他言語で開発することもある。OSSやそのコミュニティの文化が好き。
目次
献辞
著者について
レビューアについて
日本語翻訳出版によせて(改訂3版)
日本語版まえがき
- 翻訳にあたって
- 謝辞
翻訳者紹介
はじめに
- 本書はだれのために書かれたのか?
- 本書でカバーしている内容
- 本書を最大限に活かすために
第1部 始める前に
第1章 現在のPythonのステータス
- 1.1 事前準備
- 1.2 今どこにいて、どこに向かおうとしているのか?
- 1.3 Pythonはなぜ/どのように変化するのか?
- 1.4 PEP文書から最新の変更情報を得る
- 1.5 本書執筆時点でのPython 3の普及状況
- 1.6 Python 3とPython 2の主な違い
- 1.6.1 なぜそれを気にする必要があるのか?
- 1.6.2 主な構文上の違いと、よくある落とし穴
- 1.6.3 バージョン間の互換性を保つときによく利用されるツールやテクニック
- 1.7 CPython以外の世界
- 1.7.1 なぜCPython以外も考慮すべきなのか
- 1.7.2 Stackless Python
- 1.7.3 Jython
- 1.7.4 IronPython
- 1.7.5 PyPy
- 1.7.6 MicroPython
- 1.7.7 Graal.Python
- 1.8 役に立つリソース
- 1.9 まとめ
第2章 現代的なPythonの開発環境
- 2.1 事前準備
- 2.2 pipコマンドを利用したPythonの追加パッケージのインストール
- 2.3 実行環境の分離
- 2.3.1 アプリケーションレベルの分離とシステムレベルの分離
- 2.4 Pythonのvenv
- 2.4.1 venvとvirtualenvの違い
- 2.5 システムレベルでの環境の分離
- 2.5.1 Vagrantを使った仮想的な開発環境
- 2.5.2 Dockerを使った仮想環境
- 2.6 人気のある生産性向上ツール
- 2.6.1 拡張インタラクティブセッション —— IPython, bpython, ptpythonなど
- 2.6.2 スクリプトやプログラムにシェルを組み込む
- 2.6.3 インタラクティブデバッガ
- 2.7 まとめ
第2部 Python職人の技
第3章 構文ベストプラクティス —— クラス以外
- 3.1 事前準備
- 3.2 Pythonの組み込み型
- 3.2.1 文字列とバイト列
- 3.2.2 コンテナ
- 3.3 その他のデータ型とコンテナ
- 3.3.1 collectionsモジュールの特別なデータコンテナ
- 3.3.2 enumモジュールのシンボル列挙型
- 3.4 高度な文法
- 3.4.1 イテレータ
- 3.4.2 ジェネレータとyield文
- 3.4.3 デコレータ
- 3.4.4 コンテキストマネージャ —— with文
- 3.5 Pythonの関数型スタイルの機能
- 3.5.1 関数型プログラミングとは何か?
- 3.5.2 ラムダ関数
- 3.5.3 map()、filter()、reduce()
- 3.5.4 部分オブジェクトとpartial()関数
- 3.5.5 ジェネレータ式
- 3.6 関数と変数のアノテーション
- 3.6.1 一般的な使用方法
- 3.6.2 mypyによる静的型チェック
- 3.6.3 型ヒントの現在と未来
- 3.7 知っておくべきその他の文法
- 3.7.1 for … else節
- 3.7.2 キーワードのみの引数
- 3.7.3 セイウチ(walrus)演算子による代入式
- 3.8 まとめ
第4章 構文ベストプラクティス —— クラスの世界
- 4.1 事前準備
- 4.2 Python言語のプロトコル —— dunderメソッドと属性
- 4.3 データクラスを利用したボイラープレートの削除
- 4.4 組み込みクラスのサブクラス化
- 4.5 MROとスーパークラスからメソッドへのアクセス
- 4.5.1 Pythonのメソッド解決順序(MRO)を理解する
- 4.5.2 superの落とし穴
- 4.5.3 ベストプラクティス
- 4.6 高度な属性アクセスのパターン
- 4.6.1 ディスクリプタ
- 4.6.2 プロパティ
- 4.6.3 スロット
- 4.7 まとめ
第5章 メタプログラミングの要素
- 5.1 事前準備
- 5.2 メタプログラミングとは何か?
- 5.2.1 デコレータ —— メタプログラミングの手法
- 5.2.2 クラスデコレータ
- 5.2.3 __new__()を使ってインスタンス生成処理をオーバーライドする
- 5.2.4 メタクラス
- 5.2.5 コード生成
- 5.3 まとめ
第6章 良い名前を選ぶ
- 6.1 事前準備
- 6.2 PEP 8と命名規則のベストプラクティス
- 6.2.1 どうして、いつPEP 8に従うのか
- 6.2.2 PEP 8のその先へ —— チーム固有のスタイルガイドライン
- 6.3 命名規則のスタイル
- 6.3.1 変数
- 6.4 名前付けガイド
- 6.4.1 ブール値の名前の前にhasかisをつける
- 6.4.2 コレクションの変数名は複数形にする
- 6.4.3 辞書型に明示的な名前をつける
- 6.4.4 汎用性の高い名前や冗長な名前を避ける
- 6.4.5 既存の名前を避ける
- 6.5 引数のベストプラクティス
- 6.5.1 反復型設計を行いながら引数を作成する
- 6.5.2 引数とテストを信頼する
- 6.5.3 魔法の引数である*argsと**kwargsは注意して使用する
- 6.6 クラス名
- 6.7 モジュール名とパッケージ名
- 6.8 役に立つツール
- 6.8.1 Pylint
- 6.8.2 pycodestyleとflake8
- 6.9 まとめ
第7章 パッケージを作る
- 7.1 事前準備
- 7.2 パッケージ作成
- 7.2.1 混乱するPythonパッケージングツールの状態
- 7.2.2 プロジェクトの設定
- 7.2.3 カスタムセットアップコマンド
- 7.2.4 開発時にパッケージを利用する
- 7.3 名前空間パッケージ
- 7.3.1 なぜこれが便利なのか?
- 7.4 パッケージのアップロード
- 7.4.1 PyPI —— Python Package Index
- 7.4.2 ソースパッケージとビルド済みパッケージ
- 7.5 スタンドアローン実行形式
- 7.5.1 スタンドアローンの実行形式が便利な場面
- 7.5.2 人気のあるツール
- 7.5.3 実行可能形式のパッケージにおけるPythonコードの難読化
- 7.6 まとめ
第8章 コードをデプロイする
- 8.1 事前準備
- 8.2 The Twelve-Factor App
- 8.3 デプロイを自動化するいくつかのアプローチ
- 8.3.1 Fabricを用いたデプロイの自動化
- 8.4 専用のパッケージインデックスやミラーを用意する
- 8.4.1 PyPIをミラーリングする
- 8.4.2 Pythonパッケージに追加リソースをバンドルする
- 8.5 一般的な慣習とプラクティス
- 8.5.1 ファイルシステムの階層
- 8.5.2 環境の分離
- 8.5.3 プロセス監視ツールを使う
- 8.5.4 アプリケーションコードはユーザー空間で実行しよう
- 8.5.5 リバースHTTPプロキシを使う
- 8.5.6 プロセスのgracefulリロード
- 8.6 動作の追跡とモニタリング
- 8.6.1 エラーログ収集 —— Sentry
- 8.6.2 モニタリングシステムとアプリケーションメトリクス
- 8.6.3 アプリケーションログの処理
- 8.6.4 ログを処理するツール
- 8.7 まとめ
第9章 他言語によるPythonの拡張
- 9.1 事前準備
- 9.2 他言語 ≒ C/C++
- 9.2.1 拡張モジュールをインポートする
- 9.3 拡張を使う理由
- 9.3.1 コードのクリティカルな部分の性能を向上する
- 9.3.2 別の言語で書かれたコードを利用する
- 9.3.3 サードパーティーの動的ライブラリを利用する
- 9.3.4 カスタムのデータ構造を作る
- 9.4 拡張を書く
- 9.4.1 ピュアC拡張
- 9.4.2 Cythonを使って拡張を書く
- 9.5 拡張のデメリット
- 9.5.1 増加する複雑さ
- 9.5.2 デバッグ
- 9.6 拡張を使わずに動的ライブラリを利用する
- 9.6.1 ctypes
- 9.6.2 CFFI
- 9.7 まとめ
第3部 量より質
第10章 コードの管理
- 10.1 事前準備
- 10.2 バージョン管理システムを使う
- 10.2.1 中央集中型システム
- 10.2.2 分散型システム
- 10.2.3 中央集中か、分散か?
- 10.2.4 できればGitを使う
- 10.2.5 Git FlowとGitHub Flow
- 10.3 継続的開発プロセスの設定
- 10.3.1 継続的インテグレーション
- 10.3.2 継続的デリバリー
- 10.3.3 継続的デプロイメント
- 10.3.4 継続的インテグレーションを行うのに人気のあるツール
- 10.3.5 適切なツール選択とよくある落とし穴
- 10.4 まとめ
第11章 プロジェクトのドキュメント作成
- 11.1 事前準備
- 11.2 技術文書を書くための7つのルール
- 11.2.1 2つのステップで書く
- 11.2.2 対象読者を明確にする
- 11.2.3 シンプルなスタイルを使用する
- 11.2.4 情報のスコープを絞る
- 11.2.5 実在するようなコードのサンプルを使用する
- 11.2.6 なるべく少なく、かつ十分なドキュメント
- 11.2.7 テンプレートの使用
- 11.3 ドキュメントをコードのように扱う
- 11.3.1 Pythonのdocstringを使う
- 11.3.2 人気のマークアップ言語とドキュメントスタイル
- 11.4 ドキュメントを自動生成する有名なPythonライブラリ
- 11.4.1 Sphinx
- 11.4.2 MkDocs
- 11.4.3 ドキュメントをCIでビルドする
- 11.5 Web APIドキュメント
- 11.5.1 Swagger/OpenAPIによるAPIドキュメントの自動生成
- 11.6 整理されたドキュメントシステムの構築
- 11.6.1 ドキュメントポートフォリオの構築
- 11.7 自分自身のドキュメントポートフォリオを構築する
- 11.7.1 ドキュメントランドスケープの構築
- 11.8 まとめ
第12章 テスト駆動開発
- 12.1 事前準備
- 12.2 テストをしていない人へ
- 12.2.1 テスト駆動開発のシンプルな3つのステップ
- 12.2.2 どのような種類のテストがあるのか?
- 12.2.3 Pythonの標準テストツール
- 12.3 テストをしている人へ
- 12.3.1 ユニットテストの落とし穴
- 12.3.2 代替のユニットテストフレームワーク
- 12.3.3 テストカバレッジ
- 12.3.4 スタブとモック
- 12.3.5 テスト環境と依存関係の互換性
- 12.3.6 ドキュメント駆動開発
- 12.4 まとめ
第4部 最適化
第13章 最適化 —— 一般原則とプロファイリング
- 13.1 事前準備
- 13.2 3つのルール
- 13.2.1 まず、動かす
- 13.2.2 ユーザー視点で考える
- 13.2.3 可読性とメンテナンス性を保つ
- 13.3 最適化戦略
- 13.3.1 外部の原因を探す
- 13.3.2 ハードウェアを拡張する
- 13.3.3 スピードテストを書く
- 13.4 ボトルネックを見つける
- 13.4.1 CPU使用量のプロファイル
- 13.4.2 メモリ使用量のプロファイル
- 13.4.3 ネットワーク使用量のプロファイル
- 13.5 まとめ
第14章 最適化 —— テクニック集
- 14.1 事前準備
- 14.2 複雑度の定義
- 14.2.1 循環的複雑度
- 14.2.2 ビッグオー記法
- 14.3 正しいデータ構造を選び計算量を減らす
- 14.3.1 リストからの探索
- 14.4 collectionsモジュールを使う
- 14.4.1 deque
- 14.4.2 namedtuple
- 14.5 トレードオフを利用する
- 14.5.1 ヒューリスティックアルゴリズムや近似アルゴリズムを使う
- 14.5.2 タスクキューを使って遅延処理を行う
- 14.5.3 確率的データ構造を利用する
- 14.6 キャッシュ
- 14.6.1 決定的キャッシュ
- 14.6.2 非決定的キャッシュ
- 14.6.3 キャッシュサーバー
- 14.7 まとめ
第15章 並行処理
- 15.1 事前準備
- 15.2 なぜ並行処理が必要なのか?
- 15.3 マルチスレッド
- 15.3.1 マルチスレッドとは?
- 15.3.2 Pythonはどのようにスレッドを扱うのか?
- 15.3.3 いつスレッドを使うべきか?
- 15.4 マルチプロセス
- 15.4.1 組み込みのmultiprocessingモジュール
- 15.5 非同期プログラミング
- 15.5.1 協調的マルチタスクと非同期I/O
- 15.5.2 Pythonにおけるasyncとawait
- 15.5.3 非同期プログラミングの実践例
- 15.5.4 Futureを利用して同期コードを結合する
- 15.6 まとめ
第5部 技術的アーキテクチャ
第16章 イベント駆動型プログラミング
- 16.1 事前準備
- 16.2 イベント駆動型プログラミングとは何か
- 16.2.1 イベント駆動 != 非同期
- 16.2.2 GUIにおけるイベント駆動プログラミング
- 16.2.3 イベント駆動通信
- 16.3 イベント駆動プログラミングのスタイル
- 16.3.1 Callback-basedスタイル
- 16.3.2 Subject-based スタイル
- 16.3.3 Topic-basedスタイル
- 16.4 イベント駆動アーキテクチャ
- 16.4.1 イベントとメッセージキュー
- 16.5 まとめ
第17章 Pythonのためのデザインパターン
- 17.1 事前準備
- 17.2 生成に関するパターン
- 17.2.1 Singletonパターン
- 17.3 構造に関するパターン
- 17.3.1 Adapterパターン
- 17.3.2 Proxyパターン
- 17.3.3 Facadeパターン
- 17.4 振る舞いに関するパターン
- 17.4.1 Observerパターン
- 17.4.2 Visitorパターン
- 17.4.3 Templateパターン
- 17.5 まとめ
付録A reStructuredText入門
- A.1 reStructuredText
- A.1.1 セクション構造
- A.1.2 箇条書き
- A.1.3 インラインマークアップ
- A.1.4 リテラルブロック
- A.1.5 リンク
付録B 型ヒントの書き方
- B.1 変数の型付け
- B.2 関数やメソッドの型付け
- B.3 ユーザー定義クラスの型付け
- B.4 型よりも厳しく、特定の文字列や数値のリテラルのみを許可する
- B.5 ジェネリクス
- B.5.1 コレクションの種類の使い分け
- B.5.2 タプルと他のシーケンスの違い
- B.6 合併型(Union Type)/オプショナル
- B.7 あらゆる型を受け付けるAny
- B.8 キャスト
- B.9 関数のオーバーロード