関連サイト
本書の関連ページが用意されています。
内容紹介
Pythonプログラミングにおけるデザイン、コーディング、ディストリビューションのベストプラクティスを伝授します。
「本書では、Pythonで仕事をしている開発者達に使用されているベストプラクティスを説明しています。
本書のタイトルは最初『Pythonベストプラクティス』という名前だったのですが、Pythonの言語そのものだけではなく、Pythonで仕事をするときに使用されるツールやテクニックについてのトピックも追加されたため、最終的には『エキスパートPythonプログラミング』という名前になりました。
言い換えると、本書は先進的なPython開発者が毎日どのように仕事をしているのかを説明するものです。」(本書「はじめに」より)
書誌情報
- 著者: Michał Jaworski, Tarek Ziadé(著), 稲田直哉, 芝田将, 渋川よしき, 清水川貴之, 森本哲也(訳)
- 発行日: 2018-02-26 (紙書籍版発行日: 2018-02-26)
- 最終更新日: 2018-02-26
- バージョン: 1.0.0
- ページ数: 520ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: アスキードワンゴ
対象読者
Pythonを日頃使われている方、よりPythonを使いこなしたい方
著者について
Michał Jaworski
Michal Jaworskiには7年におよぶPythonの経験があります。falcon上に構築されたRESTフレームワークであるgracefulの作者でもあります。彼はこれまで複数の会社でさまざまな役割を経験してきました。その経験は、普通のフルスタック開発者からソフトウェアアーキテクトを経て、成長が速いスタートアップにおけるエンジニアリングの統括責任者までに至ります。現在はOperaソフトウェアのTVストアチームのバックエンドエンジニアのリーダーを務めています。彼は高性能な分散サービスの設計について、豊富な経験を持っています。さらに人気のあるPythonのオープンソースプロジェクトに対しても積極的にコントリビューターとして活動しています。
Tarek Ziadé
Tarek ZiadeはMozillaのエンジニアリングマネージャです。Firefox向けにスケールするPythonのWebサービスを構築するのに特化したチームで働いています。彼はPythonのパッケージング周りの成果にコントリビュートしていて、初期のZopeの頃から多くのPython Webフレームワークに関わってきました。TarekはフランスのPythonユーザーグループであるAfpyを創設し、Pythonに関する2冊の書籍をフランス語で執筆しています。彼はフランス語での発表やチュートリアルを数多く開催すると共に、Solutions Linux、PyCon、OSCON、EuroPythonなどの国際的なイベントでも発表しています。
稲田直哉
KLab株式会社所属のOSS開発者。Python 3.6でdictの新実装を開発し、Pythonコア開発者になった。ブログはhttp://methane.hatenablog.jp、Twitterアカウントは@methane
芝田将
ボルダリングとOSS 開発が趣味のPython エンジニア。学生時代から多くのPython ライブラリを開発し、Github(@c-bata)で公開している。本書の翻訳中に明石高専専攻科を卒業し、動画配信サービスの会社に就職した。現在は普段使いのツールとしてPython を利用しつつも、業務ではGo 言語やTypeScript(Web フロント)を使ってMPEG-DASH やHLS の動画配信システムを開発している。サイトはhttp://c-bata.link/、Twitterアカウントは@c_bata_
渋川よしき
三女の父。ホンダ→ DeNA →フューチャーアーキテクト。本章の10 章でも紹介され、本書の翻訳でも活躍した、ドキュメントツールSphinx の普及と発展のためにSphinx-Users.jp の設立をするかたわら、拡張プラグインの開発、本体の機能拡張にも取り組んでいる。オライリー・ジャパンから『RealWorld HTTP』、ラムダノートから『Go ならわかるシステムプログラミング』を出版。ブログはhttp://blog.shibu.jp、Twitterアカウントは@shibu_jp
清水川貴之
株式会社ビープラウド所属、一般社団法人PyCon JP会計理事。ドキュメンテーションツールSphinxのコミッター。2003年にZope2をきっかけにPythonを使い始め、それがオープンソース等のコミュニティ活動を始めるきっかけとなった。Python mini hack-a-thonやSphinx-Users.jpの運営の1人。最近は、公私ともにPythonを教える立場で多く活動している。著書/訳書『Pythonプロフェッショナルプログラミング第2版』(2015年、秀和システム刊)『Sphinxをはじめよう第2版』(2017年、オライリー・ジャパン刊)。サイトはhttp://清水川.jp/、Twitterアカウントは@shimizukawa
森本哲也
ヤフー株式会社データ&サイエンスソリューション統括本部所属。主に業務アプリケーションのサーバーサイド開発を行ってきたが、転職を機にインフラエンジニアになった。運用の品質向上や効率化のためにSRE(サイトリライアビリティエンジニアリング)を業務に取り入れることをミッションとして、その概念を勉強している。Pythonは普段使いのツールとして使いつつも業務ではJavaやGo言語で開発することが多い。OSSやそのコミュニティの文化が好き。
目次
著者について
レビューアについて
日本語翻訳出版によせて(初版)
日本語翻訳出版によせて(改訂2版)
日本語版まえがき
- 翻訳にあたって
- 謝辞
翻訳者紹介
はじめに
- 本書でカバーしている内容
- 本書を読むにあたって必要なもの
- 本書はだれのために書かれたのか?
- 本書の表記法
- 読者フィードバック
第1章 現在のPythonのステータス
- 1.1 われわれは今どこにいて、どこに行こうとしているのか?
- 1.2 Pythonはなぜ/どのように変化するのか?
- 1.3 PEP文書から最新の変更情報を得る
- 1.4 本書執筆時点でのPython 3の浸透度合い
- 1.5 Python 3とPython 2の主な違い
- 1.5.1 なぜそれを気にする必要があるのか?
- 1.5.2 主な構文上の違いと、よくある落とし穴
- 1.5.3 バージョン間の互換性を保つときによく利用されるツールやテクニック
- 1.6 CPython以外の世界
- 1.6.1 なぜCPython以外も考慮すべきなのか
- 1.6.2 Stackless Python
- 1.6.3 Jython
- 1.6.4 IronPython
- 1.6.5 PyPy
- 1.7 現代的なPython開発の手法
- 1.8 アプリケーションレベルでのPython環境の分離
- 1.8.1 なぜ分離が必要なのか?
- 1.8.2 人気のあるソリューション
- 1.8.3 どのツールを選択すべきか?
- 1.9 システムレベルでの環境の分離
- 1.9.1 Vagrantを使った仮想的な開発環境
- 1.9.2 コンテナ化VS仮想化
- 1.10 人気のある生産性向上ツール
- 1.10.1 拡張インタラクティブセッション —— IPython, bpython, ptpythonなど
- 1.10.2 インタラクティブデバッガ
- 1.11 役に立つリソース
- 1.12 まとめ
第2章 構文ベストプラクティス—— クラス以外
- 2.1 Pythonの組み込み型
- 2.1.1 文字列とバイト列
- 2.1.2 コレクション
- 2.2 高度な文法
- 2.2.1 イテレータ
- 2.2.2 yield文(ジェネレータ)
- 2.2.3 デコレータ
- 2.3 知っておくべきその他の文法
- 2.3.1 for … else節
- 2.3.2 関数アノテーション
- 2.4 まとめ
第3章 構文ベストプラクティス —— クラスの世界
- 3.1 組み込みクラスのサブクラス化
- 3.2 スーパークラスのメソッドへのアクセス
- 3.2.1 旧スタイルクラスとPython 2のsuper
- 3.2.2 Pythonのメソッド解決順序(MRO)を理解する
- 3.2.3 superの落とし穴
- 3.2.4 ベストプラクティス
- 3.3 高度な属性アクセスのパターン
- 3.3.1 ディスクリプタ
- 3.3.2 プロパティ
- 3.3.3 スロット
- 3.4 メタプログラミング
- 3.4.1 デコレータ —— メタプログラミングの方法
- 3.4.2 クラスデコレータ
- 3.4.3 __new__()メソッドによるインスタンス作成プロセスのオーバーライド
- 3.4.4 メタクラス
- 3.4.5 コード生成のTips
- 3.5 まとめ
第4章 良い名前を選ぶ
- 4.1 PEP 8と命名規則のベストプラクティス
- 4.1.1 どうして、いつPEP 8に従うのか
- 4.1.2 PEP 8のその先へ —— チーム固有のスタイルガイドライン
- 4.2 命名規則のスタイル
- 4.2.1 変数
- 4.3 名前づけガイド
- 4.3.1 ブール値の名前の前にhasかisをつける
- 4.3.2 コレクションの変数名は複数形にする
- 4.3.3 辞書型に明示的な名前をつける
- 4.3.4 汎用性の高い名前を避ける
- 4.3.5 既存の名前を避ける
- 4.4 引数のベストプラクティス
- 4.4.1 反復型設計を行いながら引数を作成する
- 4.4.2 引数とテストを信頼する
- 4.4.3 魔法の引数である*argsと**kwargsは注意して使用する
- 4.5 クラス名
- 4.6 モジュール名とパッケージ名
- 4.7 役に立つツール
- 4.7.1 Pylint
- 4.7.2 pycodestyleとflake8
- 4.8 まとめ
第5章 パッケージを作る
- 5.1 パッケージ作成
- 5.1.1 混乱するPythonパッケージングツールの状態
- 5.1.2 プロジェクトの設定
- 5.1.3 カスタムセットアップコマンド
- 5.1.4 開発時にパッケージを利用する
- 5.2 名前空間パッケージ
- 5.2.1 なぜこれが便利なのか?
- 5.2.2 PEP 420 —— 暗黙の名前空間パッケージ
- 5.2.3 以前のバージョンのPythonにおける名前空間パッケージ
- 5.3 パッケージのアップロード
- 5.3.1 PyPI —— Python Package Index
- 5.3.2 ソースパッケージとビルド済みパッケージ
- 5.4 スタンドアローン実行形式
- 5.4.1 スタンドアローンの実行形式が便利な場面
- 5.4.2 人気のあるツール
- 5.4.3 実行可能形式のパッケージにおけるPythonコードの難読化
- 5.5 まとめ
第6章 コードをデプロイする
- 6.1 The Twelve-Factor App
- 6.2 Fabricを用いたデプロイの自動化
- 6.3 専用のパッケージインデックスやミラーを用意する
- 6.3.1 PyPIをミラーリングする
- 6.3.2 パッケージを使ったデプロイ
- 6.4 一般的な慣習と実践
- 6.4.1 ファイルシステムの階層
- 6.4.2 環境の分離
- 6.4.3 プロセス監視ツールを使う
- 6.4.4 アプリケーションコードはユーザー空間で実行しよう
- 6.4.5 リバースHTTPプロキシを使う
- 6.4.6 プロセスのgracefulリロード
- 6.5 動作の追跡とモニタリング
- 6.5.1 エラーログ収集 —— sentry/raven
- 6.5.2 モニタリングシステムとアプリケーションメトリクス
- 6.5.3 アプリケーションログの処理
- 6.5.4 ログを処理するツール
- 6.6 まとめ
第7章 他言語によるPythonの拡張
- 7.1 他言語 = C/C++
- 7.1.1 C/C++による拡張
- 7.2 拡張を使う理由
- 7.2.1 コードのクリティカルな部分の性能を向上する
- 7.2.2 別の言語で書かれたコードを利用する
- 7.2.3 サードパーティー製の動的ライブラリを利用する
- 7.2.4 カスタムのデータ構造を作る
- 7.3 拡張を書く
- 7.3.1 ピュアC拡張
- 7.3.2 Cython
- 7.4 拡張のデメリット
- 7.4.1 増加する複雑さ
- 7.4.2 デバッグ
- 7.5 拡張を使わずに動的ライブラリを利用する
- 7.5.1 ctypes
- 7.5.2 CFFI
- 7.6 まとめ
第8章 コードの管理
- 8.1 バージョン管理システム
- 8.1.1 中央集中型システム
- 8.1.2 分散型システム
- 8.1.3 中央集中か、分散か?
- 8.1.4 できればGitを使う
- 8.1.5 Git flowとGitHub flow
- 8.2 継続的開発プロセス
- 8.2.1 継続的インテグレーション
- 8.2.2 継続的デリバリー
- 8.2.3 継続的デプロイメント
- 8.2.4 継続的インテグレーションを行うのに人気のあるツール
- 8.2.5 適切なツール選択とよくある落とし穴
- 8.3 まとめ
第9章 プロジェクトのドキュメント作成
- 9.1 技術文書を書くための 7つのルール
- 9.1.1 2つのステップで書く
- 9.1.2 読者のターゲットを明確にする
- 9.1.3 シンプルなスタイルを使用する
- 9.1.4 情報のスコープを絞る
- 9.1.5 実在するようなコードのサンプルを使用する
- 9.1.6 なるべく少なく、かつ十分なドキュメント
- 9.1.7 テンプレートの使用
- 9.2 reStructuredText入門
- 9.2.1 セクション構造
- 9.2.2 Lists
- 9.2.3 インラインマークアップ
- 9.2.4 リテラルブロック
- 9.2.5 リンク
- 9.3 ドキュメントの構築
- 9.3.1 ポートフォリオの構築
- 9.4 自分自身のポートフォリオを構築する
- 9.4.1 ランドスケープの構築
- 9.4.2 ドキュメントのビルドと継続的インテグレーション
- 9.5 まとめ
第10章 テスト駆動開発
- 10.1 テストをしていない人へ
- 10.1.1 テスト駆動開発の原則
- 10.1.2 どのような種類のテストがあるのか?
- 10.1.3 Pythonの標準テストツール
- 10.2 テストをしている人へ
- 10.2.1 ユニットテストの落とし穴
- 10.2.2 代替のユニットテストフレームワーク
- 10.2.3 テストカバレッジ
- 10.2.4 スタブとモック
- 10.2.5 テスト環境と依存関係の互換性
- 10.2.6 ドキュメント駆動開発
- 10.3 まとめ
第11章 最適化 —— 一般原則とプロファイリングテクニック
- 11.1 3つのルール
- 11.1.1 まず、動かす
- 11.1.2 ユーザー視点で考える
- 11.1.3 可読性とメンテナンス性を保つ
- 11.2 最適化戦略
- 11.2.1 外部の原因を探す
- 11.2.2 ハードウェアを拡張する
- 11.2.3 スピードテストを書く
- 11.3 ボトルネックを見つける
- 11.3.1 CPU使用量のプロファイル
- 11.3.2 メモリ使用量のプロファイル
- 11.3.3 Cコードのメモリリーク
- 11.3.4 ネットワーク使用量のプロファイル
- 11.4 まとめ
第12章 最適化 —— いくつかの強力な解決方法
- 12.1 複雑度を下げる
- 12.1.1 循環的複雑度
- 12.1.2 ビッグオー記法
- 12.2 シンプルにする
- 12.2.1 リストからの探索
- 12.2.2 listの代わりにsetを使う
- 12.2.3 外部呼び出しを減らす
- 12.3 collectionsモジュールを使う
- 12.3.1 deque
- 12.3.2 defaultdict
- 12.3.3 namedtuple
- 12.4 トレードオフを利用する
- 12.4.1 ヒューリスティクスや近似アルゴリズムを使う
- 12.4.2 タスクキューを使って遅延処理を行う
- 12.4.3 確率的データ構造を利用する
- 12.5 キャッシュ
- 12.5.1 決定的キャッシュ
- 12.5.2 非決定的キャッシュ
- 12.5.3 キャッシュサーバー
- 12.6 まとめ
第13章 並行処理
- 13.1 なぜ並行処理が必要なのか?
- 13.2 マルチスレッド
- 13.2.1 マルチスレッドとは?
- 13.2.2 Pythonはどのようにスレッドを扱うのか?
- 13.2.3 いつスレッドを使うべきか?
- 13.3 マルチプロセス
- 13.3.1 組み込みのmultiprocessingモジュール
- 13.4 非同期プログラミング
- 13.4.1 協調的マルチタスクと非同期I/O
- 13.4.2 Pythonにおけるasyncとawait
- 13.4.3 以前のバージョンにおけるasyncio
- 13.4.4 非同期プログラミングの実践例
- 13.4.5 Futureを利用して同期コードを結合する
- 13.5 まとめ
第14章 Pythonのためのデザインパターン
- 14.1 生成に関するパターン
- 14.1.1 Singletonパターン
- 14.2 構造に関するパターン
- 14.2.1 Adapterパターン
- 14.2.2 Proxyパターン
- 14.2.3 Facadeパターン
- 14.3 振る舞いに関するパターン
- 14.3.1 Observerパターン
- 14.3.2 Visitorパターン
- 14.3.3 Templateパターン
- 14.4 まとめ