これはなに
Effective Python 第2版 、項目2「PEP 8スタイルガイドに従う」のまとめ。
ポイント
- 常にPEP 8スタイルガイドに従ってPythonコードを書こう
- 大きなコミュニティの共通スタイルを共有すれば、協働作業がはかどる
- 一貫したスタイルは、後の修正しやすさにつながる
PEP 8とは
PEP 8とは、Python拡張提案(Python Enhancement Proposal)の8番目の文章である。これは、Pythonのコードをどのようにフォーマットするかのスタイルガイドである。明確なPythonコードの書き方に関する詳細な説明が豊富に記されている。
PEP 8は下記のリンクから読める。これはPython言語の進化とともに継続的に更新されている。
スタイルガイドの必要性
Pythonのコードは正しい構文であればどのように書いてもよいが、一貫したスタイルに従うと下記の利点がある。
- コードがより扱いやすく、より読みやすくなる
- 他のPythonプログラマと共通のスタイルを分かち合うことで、プロジェクトでの協働作業がはかどる
- コードを読む人が自分以外にいなくても、後の変更作業が容易になる
従うべき主なルール
空白
- インデントは空白4個
- 1行79文字以下
- 長い式を改行する場合は1つインデントする
- 関数とクラスは2行空ける、クラス内メソッドは1行空ける
- 辞書
- キーとコロンの間はスペースを空けない
- 同じ行に値を書く場合は、値の前に空白を1つ空ける
- 変数代入の前後には空白を1つ空ける、2つ以上空けない
- 型ヒント(型アノテーション)
- 変数名の直後にコロンを置く
- 型情報の前に空白を1つ置く
名前付け
対象 | 名前付けルール | 例 |
---|---|---|
関数、変数、属性 | lower_snake_case | lowercase_underscore |
protected属性 | アンダースコアを1つ先頭につける | _leading_underscore |
private属性 | アンダースコアを2つ先頭につける | __double_underscore |
クラス、例外 | UpperCamelCase | CapitalizedWord |
モジュールでの定数 | UPPER_SNAKE_CASE | ALL_CAPS |
- クラスのインスタンスメソッドでは、第一引数の名前に
self
を使う - クラスメソッドは、第一引数の名前に
cls
を使う
式と文
Pythonでimport this
を実行すると、「The Zen of Python」が表示される。これは、Pythonプログラマの心構えを簡潔に記したものである。
「The Zen of Python」には「明らかなやり方が1つ、できれば1つだけあるのがいい」という下記の記述がある。
There should be one– and preferably only one –obvious way to do it.
PEP 8では、これを式と文のガイダンスで実現している。
- 式の否定(
if not a is b
)ではなく内側の項の否定(if a is not b
)を使う - 空値の判定は
if not somelist
を使う- 空値が暗黙に
False
と評価されることを使う - コンテナやシーケンスの長さ(
lf len(somelist) == 0
)で空値([]
,''
)を判定しない
- 空値が暗黙に
- 非空値の判定は
if somelist
を使う- 非空値について、
if somelist
は暗黙にTrue
と評価される
- 非空値について、
if
文、for
文、while
文、except
複合文を1行で書かない- 式が1行に収まらない場合は、括弧でくくり複数行にして、読みやすくインデントする
\
で行分けするより、括弧を使って複数の式を囲むほうが良い
インポート
import
文は常にファイルの先頭に置く- インポートするときは常にモジュールの絶対名を使う
- 現モジュールのパスからの相対名は使わない
- 相対インポートを使わなければならない場合は、明示的な構文
from . import foo
を使う - インポートは①標準ライブラリ、②サードパーティー、③自作モジュール、の順に行う
- それぞれの部分はアルファベット順にインポートする
PEP 8に従っているか確認する
PythonにはLinter(e.g. pylint
, flake8
)がある。これらは、自動でPEP 8スタイルガイドに沿っているか確認して、かつ、Pythonプログラムでよく見られる他の種類のエラーを検出する。また、多くのエディタやIDEにも同様の機能がある。