関連サイト
本書の関連ページが用意されています。
内容紹介
Pythonプログラマ必読と言われるベストセラーが、最新のPython環境に合わせて全面改訂されました。今回の改訂では本書の構成を一から見直し、現代のPythonプログラマが身につけるべき技術・ノウハウを学びやすく、より身につけやすくしています。
本書は、Pythonを使って仕事をしている開発者が普段どのようなツールやテクニックを用いて仕事をしているのか、また開発者が実際に現場で用いているベストプラクティスについて解説した書籍です。本書を読むことで、先進的なPythonプログラマが日常的に使用している開発ノウハウを学ぶことができます。
書誌情報
- 著者: Michał Jaworski, Tarek Ziadé(著), 新井正貴, 稲田直哉, 渋川よしき, 清水川貴之, 福田隼也(訳)
- 発行日: 2023-07-21 (紙書籍版発行日: 2023-07-21)
- 最終更新日: 2023-07-21
- バージョン: 1.0.0
- ページ数: 584ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: アスキードワンゴ
対象読者
著者について
Michał Jaworski
Michal Jaworskiは、さまざまなプログラミング言語を使用したソフトウェアの開発に、10年以上の専門的な経験を持っています。Michalはキャリアの大部分で、Webアプリケーション用の高性能な分散型バックエンドサービスを開発してきました。複数の企業で、普通のソフトウェアエンジニアからリードソフトウェアアーキテクトまで、さまざまな役割を担ってきました。彼の最愛の言語は、常にPythonであり続けます。
Tarek Ziadé
Tarek Ziadéは、フランスのブルゴーニュ地方に住むソフトウェアエンジニアです。Elastic社で開発者向けツールの開発に携わっています。Elastic以前はMozillaに10年勤務し、AFPyというフランスのPythonユーザーグループを設立しました。また、Pythonに関する記事をさまざまな雑誌に寄稿しており、フランス語と英語の書籍も数冊執筆しています。
新井正貴
東京大学文学部卒業、アライドアーキテクツ株式会社にて勤務。2016年4月、株式会社SQUEEZEに入社。コミュニティ活動として、PyCon JP 2015~2019スタッフ、DjangoCongress JP 2018~2019スタッフ、Pythonもくもく会の主催など。
Siteはhttps://massa142.github.io/。Twitterアカウントは@massa142
稲田直哉
KLab株式会社所属のOSS開発者。Python 3.6でdictの新実装を開発し、Pythonコア開発者になっ
た。
ブログはhttps://methane.hatenablog.jp。Twitterアカウントは@methane
渋川よしき
三女の父。ホンダ→DeNA→フューチャー。本書の翻訳でも活躍した、ドキュメントツールSphinx
の普及と発展のためにSphinx-Users.jpの設立。『Real World HTTP第2版(2020 オライリー・ジャパン)』『実用Go言語(2022 オライリー・ジャパン)』『ソフトウェア設計のトレードオフと誤り(2023 オライリー・ジャパン)』、『Goならわかるシステムプログラミング第2版(2022 ラムダノート)』を出版。Go/TypeScriptなどを扱う時間も多いが、Pythonが実家。
ブログはhttp://blog.shibu.jp。Twitter アカウントは@shibu_jp
清水川貴之
株式会社ビープラウド所属。一般社団法人PyCon JP Association 会計理事。2003 年にZope2 をきっかけにPython を使い始め、それがオープンソースなどのコミュニティ活動を始めるきっかけとなった。Python mini Hack-a-thon やSphinx-users.jp などPython 関連イベント運営のかたわら、カンファレンスや書籍、OSS 開発を通じてPython 技術情報を発信している。著書/訳書:『独学コンピューターサイエンティスト(2022 年日経BP 社)』『Sphinx をはじめよう第3 版(2022 オライリー・ジャパン)』『自走プログラマー(2020 年技術評論社)』『独学プログラマー(2018 日経BP 社)』
サイトはhttp://清水川.jp/、Twitter アカウントは@shimizukawa
福田隼也
長野県の株式会社日本システム技研にて、Python を中心としたWeb システム開発にフルスタックエンジニアとして従事。現職では、GROOVE X 株式会社にて愛する力をはぐくむ家族型ロボット「Lovot(らぼっと)」の開発を行う。PyCon JP、DjangoCongress JP、EuroPython などにて登壇。コミュニティ活動として、ギークラボ長野の運営に参加。共著書に『Python 実践レシピ(2022 技術評論社)』。ビールとキャンプが好き。
ブログはhttp://blog.jrfk.dev。Twitter アカウントは@JunyaFff
目次
著者について
レビューアについて
日本語翻訳出版によせて(改訂4版)
日本語版まえがき
- 翻訳にあたって
- 謝辞
翻訳者紹介
はじめに
- 本書はだれのために書かれたのか?
- 本書でカバーしている内容
- 本書を最大限に活かすために
- サンプルソースコードのダウンロード
- 本書の表記法
第1章 現在のPythonのステータス
- 1.1 今どこにいて、どこに向かおうとしているのか?
- 1.2 Python 2の扱い方
- 1.3 最新情報への追従
- 1.3.1 PEP文書
- 1.3.2 活動しているコミュニティ
- 1.3.3 その他のリソース
- 1.4 まとめ
第2章 現代的なPythonの開発環境
- 2.1 事前準備
- 2.2 Pythonのパッケージングエコシステム
- 2.2.1 pipコマンドを利用したPythonパッケージのインストール
- 2.3 実行環境の分離
- 2.3.1 アプリケーションレベルの分離とシステムレベルの分離
- 2.4 アプリケーションレベルの環境分離
- 2.4.1 Poetryによる依存パッケージ管理
- 2.5 システムレベルの環境分離
- 2.5.1 コンテナ化と仮想化
- 2.5.2 Dockerを使った仮想環境
- 2.5.3 Vagrantを使った仮想的な開発環境
- 2.6 人気のある生産性向上ツール
- 2.6.1 拡張インタラクティブセッション
- 2.6.2 IPythonを使う
- 2.6.3 スクリプトやプログラムにシェルを組み込む
- 2.6.4 インタラクティブデバッガ
- 2.6.5 そのほかの生産性向上ツール
- 2.7 まとめ
第3章 Pythonの新しい要素
- 3.1 事前準備
- 3.2 最近追加された言語機能
- 3.2.1 辞書のマージと更新の演算子
- 3.3 代入式
- 3.3.1 構造的パターンマッチ
- 3.3.2 型ヒントのジェネリック型
- 3.3.3 Union型と|演算子
- 3.3.4 位置専用引数
- 3.3.5 zoneinfoモジュール
- 3.3.6 graphlibモジュール
- 3.4 新機能ではないが、依然として輝いている機能
- 3.4.1 breakpoint()関数
- 3.4.2 開発モード
- 3.4.3 モジュールレベルの__getattr__()と__dir__()関数
- 3.4.4 f-stringを使った文字列のフォーマット
- 3.4.5 数値リテラルのアンダースコア
- 3.4.6 secretsモジュール
- 3.5 まとめ
第4章 Pythonとほかの言語の比較
- 4.1 事前準備
- 4.2 クラスモデルとオブジェクト指向プログラミング
- 4.2.1 スーパークラスへのアクセス
- 4.2.2 多重継承とメソッド解決順序
- 4.2.3 クラスインスタンスの初期化
- 4.2.4 属性アクセスのパターン
- 4.2.5 ディスクリプタ
- 4.2.6 プロパティ
- 4.3 動的ポリモーフィズム
- 4.3.1 演算子のオーバーロード
- 4.3.2 関数とメソッドのオーバーロード
- 4.4 データクラス
- 4.5 関数型プログラミング
- 4.5.1 ラムダ関数
- 4.5.2 map()、filter()、reduce()関数
- 4.5.3 部分オブジェクトとpartial()関数
- 4.5.4 ジェネレータ
- 4.5.5 ジェネレータ式
- 4.5.6 デコレータ
- 4.6 列挙型
- 4.7 まとめ
第5章 インターフェイス、パターン、モジュール化
- 5.1 事前準備
- 5.1.1 インターフェイス
- 5.1.2 過去の定番:zope.interface
- 5.1.3 関数アノテーションや抽象基底クラスを使用する
- 5.1.4 型アノテーションを使ったインターフェイス
- 5.2 制御の反転と依存性注入
- 5.2.1 アプリケーションにおける制御の反転
- 5.2.2 依存性注入フレームワークの利用
- 5.3 まとめ
第6章 並行処理
- 6.1 事前準備
- 6.2 並行性とは何か?
- 6.3 マルチスレッド
- 6.3.1 マルチスレッドとは?
- 6.3.2 Pythonはどのようにスレッドを扱うのか?
- 6.3.3 いつマルチスレッドを使うべきか?
- 6.3.4 マルチスレッドを使用したアプリケーション例
- 6.4 マルチプロセス
- 6.4.1 multiprocessing
- 6.4.2 プロセスプールを使う
- 6.4.3 マルチスレッドのためのmultiprocessing.dummy
- 6.5 非同期プログラミング
- 6.5.1 協調的マルチタスクと非同期I/O
- 6.5.2 Pythonにおけるasyncとawait
- 6.5.3 非同期プログラミングの実践例
- 6.5.4 Future を利用して同期コードを結合する
- 6.6 まとめ
第7章 イベント駆動プログラミング
- 7.1 事前準備
- 7.2 イベント駆動プログラミングとは何か
- 7.2.1 イベント駆動 != 非同期
- 7.2.2 GUIにおけるイベント駆動プログラミング
- 7.2.3 イベント駆動通信
- 7.3 イベント駆動プログラミングのスタイル
- 7.3.1 Callback-basedスタイル
- 7.3.2 Subject-basedスタイル
- 7.3.3 Topic-basedスタイル
- 7.4 イベント駆動アーキテクチャ
- 7.4.1 イベントとメッセージキュー
- 7.5 まとめ
第8章 メタプログラミングの要素
- 8.1 事前準備
- 8.2 メタプログラミングとは何か?
- 8.3 デコレータを使って実行前の関数を変更する
- 8.3.1 さらなる深みへ:クラスデコレータ
- 8.4 クラスインスタンスの生成処理への割り込み
- 8.5 メタクラス
- 8.5.1 メタクラスの構文
- 8.5.2 メタクラスの使用例
- 8.5.3 メタクラスの落とし穴
- 8.5.4 メタクラスの代わりに __init_subclass__() メソッドを利用する
- 8.6 コード生成
- 8.6.1 exec、evalとcompile
- 8.6.2 抽象構文木
- 8.6.3 importフック
- 8.6.4 Pythonによるコード生成の注目すべき例
- 8.7 まとめ
第9章 PythonとC/C++をつなぐ
- 9.1 事前準備
- 9.2 拡張モジュールの中心となるC/C++
- 9.3 拡張モジュールのコンパイルとロード
- 9.4 拡張モジュールを使う理由
- 9.4.1 コードのクリティカルな部分の性能を向上する
- 9.4.2 別の言語で書かれたコードを利用する
- 9.4.3 サードパーティーの動的ライブラリを利用する
- 9.4.4 効率の良い独自のデータ構造を作る
- 9.5 拡張モジュールを書く
- 9.5.1 ピュアC拡張モジュール
- 9.5.2 Cythonを使って拡張モジュールを書く
- 9.6 拡張モジュールのデメリット
- 9.6.1 増加する複雑さ
- 9.6.2 デバッグの難しさ
- 9.7 拡張モジュールを使わずに動的ライブラリを利用する
- 9.7.1 ctypesモジュール
- 9.7.2 CFFI
- 9.8 まとめ
第10章 テストと品質保証の自動化
- 10.1 事前準備
- 10.2 テスト駆動開発の原則
- 10.3 pytestを使ったテストの書き方
- 10.3.1 パラメータ化テスト
- 10.3.2 pytestのフィクスチャ
- 10.3.3 スタブの利用
- 10.3.4 モックとunittest.mockモジュール
- 10.4 品質保証の自動化
- 10.4.1 テストカバレッジ
- 10.4.2 スタイルフィクサーとコードリンター
- 10.4.3 静的型解析
- 10.5 ミューテーションテスト
- 10.6 便利なテストユーティリティ
- 10.6.1 リアルなデータのフェイク
- 10.6.2 時間のフェイク
- 10.7 まとめ
第11章 Pythonパッケージの作成と配布
- 11.1 事前準備
- 11.2 ライブラリのパッケージ作成と配布
- 11.2.1 Pythonパッケージの構造
- 11.2.2 パッケージ配布物の種類
- 11.2.3 パッケージの登録と公開
- 11.2.4 パッケージのバージョンと依存の管理
- 11.2.5 自分のパッケージをインストールする
- 11.2.6 名前空間パッケージ
- 11.2.7 パッケージスクリプトとエントリポイント
- 11.3 Webアプリケーションのためのパッケージ作成
- 11.3.1 Twelve-Factor App宣言
- 11.3.2 Dockerの有効性
- 11.3.3 環境変数の扱い
- 11.3.4 アプリケーションフレームワークにおける環境変数の役割
- 11.4 スタンドアローン実行形式の作成
- 11.4.1 スタンドアローン実行形式が便利なシーン
- 11.4.2 人気のあるツール
- 11.4.3 実行可能形式のパッケージにおけるPythonコードの難読化
- 11.5 まとめ
第12章 アプリケーションの挙動とパフォーマンスの監視
- 12.1 事前準備
- 12.2 エラーとログ情報の取得
- 12.2.1 Pythonのログの要点
- 12.2.2 良いログのプラクティス
- 12.2.3 分散ログ
- 12.2.4 あとで確認するためにエラーを取得する
- 12.3 カスタムメトリクス取得のためにコードに計装する
- 12.3.1 Prometheusを利用する
- 12.4 分散アプリケーションのトレーシング
- 12.4.1 Jaegerによる分散トレーシング
- 12.5 まとめ
第13章 最適化
- 13.1 事前準備
- 13.2 パフォーマンスの問題の原因
- 13.2.1 コードの複雑さ
- 13.2.2 過度なリソース確保とリーク
- 13.2.3 過剰なI/Oとブロッキング処理
- 13.3 コードのプロファイリング
- 13.3.1 CPU使用量のプロファイル
- 13.3.2 メモリ使用量のプロファイリング
- 13.4 正しいデータ構造を選び計算量を減らす
- 13.4.1 リストからの探索
- 13.4.2 setを使う
- 13.4.3 collectionsモジュールを使う
- 13.5 トレードオフを利用する
- 13.5.1 ヒューリスティックアルゴリズムや近似アルゴリズムを使う
- 13.5.2 タスクキューを使って遅延処理を行う
- 13.5.3 確率的データ構造を利用する
- 13.5.4 キャッシュ
- 13.6 まとめ
付録A 型ヒントの書き方
- A.1 変数の型付け
- A.2 関数やメソッドの型付け
- A.3 ユーザー定義クラスの型付け
- A.4 型よりも厳しく、特定の文字列や数値のリテラルのみを許可する
- A.5 ジェネリクス
- A.5.1 コレクションの種類の使い分け
- A.5.2 タプルとほかのシーケンスの違い
- A.6 合併型(Union Type) / オプショナル
- A.7 あらゆる型を受け付けるAny
- A.8 型の絞り込み
- A.9 関数のオーバーロード