Pythonで開発するなら読んでおくべきPEP一覧
https://gyazo.com/58102ba7997b1882ca1a02852a4ebe69
PEPについて
Pythonには PEP(Python Enhancement Proposals と呼ばれるドキュメントが公開されています。これらのドキュメントはPythonコミュニティー(開発者およびユーザ)のなかで、Python についての情報や機能拡張の際に議論した結果がまとめられています。
これらのドキュメントは、大きく3つに分類されています。
標準化過程(Standard Track)のPEP:Pythonの新しい機能や実装を記述するものです。
情報提供(Informational)のPEP:Pythonの設計上の問題を記述したり、Pythonコミュニティに一般的なガイドラインや情報を提供しますが、新しい機能を提案するものではありません。
作業過程(Process)のPEP:Pythonにまつわる作業を記述したもの、または作業の変更(またはイベント)を提案したものです。作業過程のPEPは標準化過程のPEPに似ていますが、Python言語そのもの以外の分野に適用されます。
PEP は Githubで管理されていて、PEP-0 がPEP一覧、PEP-1 がPEPそのものについての説明です。
PEP 0 -- Index of Python Enhancement Proposals (PEPs):PEPの一覧
PEP1 - PEP Purpose and Guidelines:PEPとは何か?
インターネットで公開されている無数のチュートリアルは、多かれ少なかれPEPに言及し、その内容に基づいた説明すになっているはずです。
少しの時間を確保してPEPを読むことには、次のような利点があります。
Pythonの機能を理解し、なぜ、これらの機能を設計する必要があったのかという背景や意味を知ることができる
コミュニティ動向を把握し、ベストプラクティスを学び、自分の学習の方向性を調整し、仕事の内容を改善することができる
過去/現在に議論されているトピックに参加したり、新しいPEPを提出し、Pythonコミュニティに貢献できる
規約や仕様を読むことで、どのように定義しておくべきか学ぶことができる
英語に接することができる (^^)
Pythonプログラマの思想や指針
Python プログラマであれば読んで身につけておくべきだと言えるPEPには次のものがあります。
PEP 20 -- The Zen of Python:Pythonの開発を通して読んで適用するべき考え方をまとめたもの。import thisとすると読める。
PEP 8 -- Style Guide for Python Code:Python コーディングスタイルガイド
PEP 257 -- Docstring Conventions:docstring の規約
PEP 287 -- reStructuredText Docstring Format:プレーンテキストでは物足りないときには reStructuredTextを使う
存在は知っておくべきもの
PEP 7 -- Style Guide for C Code:Cコーディングスタイルガイド
PEP 278 -- Universal Newline Support:各プラットフォームのPythonが、CR(Mac)、LF(Unix)、CR LF(Windows)の改行コードを持つファイルをどのように読み込んでインポートするか
Python の言語としての歴史をたどるもの
Python に機能が追加されたり改変された経緯をたどるPEPです。括弧の中の数値は適用されたPythonバージョンです。
今は普通に使える機能が、初めて提案され、実装にいたる経緯は面白く、技術者としての力量を高めてくれるはずです。
PEP 201 -- Lockstep Iteration: (2.0) 組み込み関数zip() の機能説明と、これをサポートするために必要な変更点ついて
PEP 202 -- List Comprehensions:(2.0) リスト内包表記について
PEP 221 -- Import As:(2.0) インポートでの別名定義(as)
PEP 234 -- Iterators:(2.1) イテレーターについて
PEP 236 -- Back to the __future__:(2.1) 後方互換のサポートについて。モジュール名とPEPタイトルにセンスを感じる。
PEP 249 -- Python Database API Specification v2.0:Pythonでデータベースを操作するときのAPI仕様の規約
PEP 255 -- Simple Generators:(2.2) ジェネレーターとyeildについて
PEP 274 -- Dict Comprehensions:(2.3/3.0) dictに適用されるリスト内包表記の美しさについて
PEP 279 -- The enumerate() built-in function:(2.3) 便利なenumerate()について
PEP 282 -- A Logging System:(2.3) logging モジュールについて
PEP 285 -- Adding a bool type:(2.3) bool型の導入について
PEP 289 -- Generator Expressions:(2.4) リスト内包表記とジェネレーターについて
PEP 308 -- Conditional Expressions:(2.5) Pythonの三項式について。A if C else B
PEP 309 -- Partial Function Application:(2.5) callableと部分的な引数リスト(位置引数とキーワード引数を含む)から新しいcallableを構築できる関数またはcallableクラスについて
PEP 318 -- Decorators for Functions and Methods:(2.4) デコレーターは関数やメソッドをラップするメソッド
PEP 322 -- Reverse Iteration:(2.4) 配列に対する逆反復をサポートする組み込み関数reverse()の追加について
PEP 324 -- subprocess - New process module:(2.4) プロセスの起動と通信のためのsubprocessモジュールについて
PEP 327 -- Decimal Data Type:(2.4) 浮動小数点では不正確すぎるために導入されたDecimal型について
PEP 328 -- Imports: Multi-Line and Absolute/Relative:(2.4) 絶対インポート、相対インポート、複数行のインポートについて
PEP 341 -- Unifying try-except and try-finally:(2.5) try構文でのelseとfinalyについて
PEP 342 -- Coroutines via Enhanced Generators:(2.5) ジェネレータのAPIと構文を強化するコルーチンについて
PEP 343 -- The "with" Statement:(2.5) "with "を追加し、標準的なtry/finally構文の置き換えについて
PEP 367 -- New Super:(2.6) メソッドが定義されたクラスと、メソッドが現在作用しているインスタンスにバインドするsuper型のインスタンスを自動的に構築する表記方法について
PEP 372 -- Adding an ordered dictionary to collections:(2.7/3.1) 順序付き辞書(OrderedDict)の追加について
PEP 389 -- argparse - New Command Line Parsing Module:(2.7/3.2) オプション解析モジュール argparse の説明
Python3での言語としての歴史をたどるもの
PEP 380 -- Syntax for Delegating to a Subgenerator:(3.3) 操作の一部を他のジェネレーターに委ねるジェネレーターについて
PEP 405 -- Python Virtual Environments:(3.3) Pythonに軽量の仮想環境のメカニズムの追加について
PEP 417 -- Including mock in the Standard Library:(3.3) Python 標準ライブラリにmockを追加することについて
PEP 435 -- Adding an Enum type to the Python standard library:(3.4) Pythonの標準ライブラリに列挙型を追加することについて
PEP 450 -- Adding A Statistics Module To The Standard Library:(3.4) Python標準ライブラリに一般的な統計関数を持つ statictisモジュールの追加について
PEP 483 -- The Theory of Type Hints:(3.5) PEP484で言及されたタイプヒントの理論を説明
PEP 484 -- Type Hints:(3.5) タイプヒントは静的解析やリファクタリングを容易にし、潜在的な実行時の型チェックや、型情報を利用したコード生成のために利用されます。
PEP 485 -- A Function for testing approximate equality:(3.5) ある値が他の値とほぼ等しいか、または「近い」かどうかを判断するisclose()関数を、標準ライブラリのmathモジュールに追加することについて
PEP 492 -- Coroutines with async and await syntax:(3.5) コルーチンをPythonにおける独立した概念とすることと、それをサポートする async/await 構文の導入について
PEP 498 -- Literal String Interpolation:(3.6) f-string の導入について
PEP 525 -- Asynchronous Generators:(3.6) 非同期ジェネレータのサポートを追加することで、Pythonの非同期機能を拡張することについて
PEP 526 -- Syntax for Variable Annotations:(3.6) PEP484で言及したタイプヒントを変数に適用することについて
PEP 530 -- Asynchronous Comprehensions:(3.6) リスト、セット、辞書での内包表記とジェネレータ式の非同期バージョンの追加を提案したもの
PEP 557 -- Data Classes:(3.7) 標準ライブラリに追加された Data Classについて
PEP 563 -- Postponed Evaluation of Annotations:(3.7) 関数アノテーションと変数アノテーションを変更して、関数定義時に評価されないように、__annotations__に文字列で保存することについて
PEP 570 -- Python Positional-Only Parameters:(3.9) Pythonの関数定義で位置指定のみのパラメータを指定するための構文/について
PEP 572 -- Assignment Expressions:(3.8) 式の中で変数に代入する(NAME := exprt)代入式について
PEP 584 -- Add Union Operators To dict:(3.9) 組み込みのdictクラスにマージ(|)とアップデート(|=)の演算子追加について
PEP 585 -- Type Hinting Generics In Standard Collections:(3.9) typingモジュールで現在利用可能なすべての標準的なコレクションにおいて、ジェネリック構文のサポートについて
PEP 589 -- TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys:(3.8) 辞書オブジェクトが特定の文字列キーのセットを持ち、それぞれが特定の型の値を持つというユースケースをサポートするために、型コンストラクタtyping.TypedDict について
PEP 614 -- Relaxing Grammar Restrictions On Decorators:(3.9) デコレータが任意の有効な式と認めることについて
PEP 616 -- String methods to remove prefixes and suffixes:(3.9) 組み込みのstrクラスへ removeprefix()と removesuffix()の追加について
PEP 593 -- Flexible function and variable annotations:(3.9) PEP 484の型アノテーションを任意のメタデータで拡張する仕組みの導入について
PEP 604 -- Allow writing union types as X | Y:(3.10) Union[X, Y] をX | Y と書けるように型の|演算子をオーバーロードすることについて
PEP 612 -- Parameter Specification Variables:(3.10) 関数のデコレータに注釈を付けることをサポートするための typing.ParamSpec と typing.Concatenate について
PEP 613 -- Explicit Type Aliases:(3.10) 割り当てをタイプ・エイリアスとして明示的に宣言する方法について
PEP 634 -- Structural Pattern Matching: Specification:(3.10) パターンマッチの技術仕様
PEP 635: Motivation and Rationale:(3.10) パターンマッチを持つ動機と理由、設計上の考慮事項
PEP 636: Tutorial:match文のチュートリアル
PEP 3000 -- Python 3000:Python 3000の開発に関するガイドラインを定めたもの
PEP 3099 -- Things that will Not Change in Python 3000:Python の仕様決定に先立って行われた議論への多くのリンクがある。
PEP 3101 -- Advanced String Formatting:既存の文字列フォーマット演算子(%) に代わるものとして、組み込みの文字列フォーマット演算の新しいシステムの提案について
PEP 3105 -- Make print a function:後方互換をすててまで print を文から関数にした経緯
PEP 3107 -- Function Annotations:Pythonの関数に任意のメタデータアノテーションを追加するための構文について
PEP 3109 -- Raising Exceptions in Python 3000:ラインノイズと言語サイズの両方を削減することを目的として、Pythonの例外発生のメカニズムに変更を加えることについて
PEP 3110 -- Catching Exceptions in Python 3000:Pythonの文法の曖昧さを排除し、例外クラスを単純化し、例外のためのガベージコレクションを単純化し、Python 3.0の言語サイズを縮小するための変更について
PEP 3115 -- Metaclasses in Python 3000:タクラスを宣言する構文の変更と、メタクラスを持つクラスの構築方法に関するセマンティクスの変更について
PEP 3119 -- Introducing Abstract Base Classes:Python 3000にAbstract Base Class (ABC)のサポートを追加する提案ついて
PEP 3120 -- Using UTF-8 as the default source encoding:デフォルトのソース・エンコーディングをASCIIからUTF-8に変更することについて
PEP 3129 -- Class Decorators:PEP 318で導入された関数やメソッドのデコレータを拡張した、クラス・デコレータについて
PEP 3135 -- New Super:メソッドが定義されたクラスと、メソッドが現在作用しているインスタンスにバインドするsuper型のインスタンスを自動的に構築する表記方法について。(PEP-367)
PEP 3148 -- futures - execute computations asynchronously:スレッドやプロセスを使って callable の評価を容易にするパッケージの設計について。concurrent.futuresモジュールは、Callableを非同期に実行するための高レベルのインターフェースを提供します。
PEP 3153 -- Asynchronous IO support:Python標準ライブラリのための非同期IOの抽象化について
PEP 3156 -- Asynchronous IO Support Rebooted: the "asyncio" Module:非同期I/Oのための asyncio モジュールについて。これは、PEP 3153 に欠けている具体的な提案
PEP 3333 -- Python Web Server Gateway Interface v1.0:様々なウェブサーバ間でのウェブアプリケーションの移植性を促進するために、ウェブサーバとPythonのウェブアプリケーションやフレームワークとの間の標準的なインターフェースの提案
パッケージングに関するもの
PEP 241 -- Metadata for Python Software Packages:Python ディストリビューションにメタデータのフォーマットについて
PEP 314 -- Metadata for Python Software Packages v1.1:同上 v1.1
PEP 345 -- Metadata for Python Software Packages 1.2:同上 v1.2
PEP 376 -- Database of Installed Python Distributions:システムにインストールされたディストリビューションを記述するための新しいフォーマットを提案
PEP 427 -- The Wheel Binary Package Format 1.0:バイナリ形式のファイルフォーマット wheel について
PEP 440 -- Version Identification and Dependency Specification:バージョン定義についての規約
PEP 503 -- Simple Repository API:PYPIを動かしている Simple Repository APIについて
PEP 508 -- Dependency specification for Python Software Packages:ッケージの依存関係を記述するための言語を規定したもの
PEP 513 -- A Platform Tag for Portable Linux Built Distributions:Linux向けにmanylinux1_{x86_64,i686}という新しいプラットフォームタグの提案
PEP 516 -- Build system abstraction for pip/conda etc:Python のソースツリーを扱う際に、pip などの配布・インストールツールが使用するプログラム的なインターフェースを規定
PEP 518 -- Specifying Minimum Build System Requirements for Python Projects:Python ソフトウェアパッケージが、選択したビルドシステムを実行するために、どのようなビルド依存性を持っているかを指定する方法を規定
PEP 561 -- Distributing and Packaging Type Information:既存のツールを活用して最小限の作業で型情報をパッケージ化して配布するための標準化された手段と、型チェッカーがモジュールを解決して型チェックのためにこの情報を収集するための順序について説明。タイプヒントを含むパッケージの作り方。