概要(PEP8は「読みやすさと一貫性」をコードに宿すための基本ルール)
PEP8はPythonの公式スタイルガイドで、見た目の揃え方や命名、インデント、改行など「どう書くと読みやすいか」を定めています。重要なのは「他人と未来の自分が理解しやすくなること」。まずはインデント4スペース、79文字以内の行長、命名規則、空白の置き方、importの並べ方、空行・コメント・docstringの基本を体に入れるのが近道です。
コードレイアウトの基礎(インデント・行長・改行)
インデントはスペース4つに統一
タブではなくスペースを使い、ネスト1段につき4スペースです。混在は読みにくさとエラーの元です。
def process(items):
for x in items: # ← 4スペース
print(x)
Python行の長さは原則79文字(説明文は72文字)
コードは79文字を目安に折り返します。docstringやコメントは72文字を目安に短めに。
# 悪い例:横に長すぎる
result = service.fetch(user_id, include_details=True, retry=3, timeout=10, cache=True)
# 良い例:括弧の内部改行で自然に折る
result = service.fetch(
user_id,
include_details=True,
retry=3,
timeout=10,
cache=True,
)
Python括弧での綺麗な改行(バックスラッシュ不要)
複数引数やリストは、括弧の中で改行して整えます。閉じ括弧は構造に合わせて縦揃えが読みやすいです。
data = {
"name": "taro",
"age": 23,
"active": True,
}
Python空白のルール(演算子・カンマ・関数定義)
演算子の前後に1スペース(ただし整列目的の過剰スペースはNG)
a = b + c # 良い
a=b+c # 悪い(詰まりすぎ)
# キーワード引数は前後のスペース不要
connect(timeout=10, retry=3)
Pythonカンマ・コロン・セミコロンの直前にスペースは入れない
items = [1, 2, 3] # 良い
items = [1,2,3 ] # 悪い(置き方が不規則)
Python関数定義や呼び出しの括弧直前にスペースは入れない
def add(a, b): # 良い
return a + b
add(1, 2) # 良い
add (1, 2) # 悪い(括弧前スペース)
Python命名規則(わかりやすさと一貫性)
変数・関数はスネークケース、小文字+アンダースコア
def total_price(amount, tax_rate):
return amount * (1 + tax_rate)
PythonクラスはCapWords(パスカルケース)
class OrderItem:
...
Python定数は全て大文字+アンダースコア
MAX_RETRY = 3
API_BASE_URL = "https://api.example.com"
Python先頭・末尾アンダースコアの意味
- 先頭1つ「_name」:内部利用の意図
- 末尾1つ「class_」:キーワード衝突回避
- 先頭2つ「__name」:クラス内名前マングリング
- 両端2つ「init」:言語の“マジック名”(予約的意味)
importの並べ方(標準→サード→自作の順、1行1モジュール)
並び順とグループ分け
- 標準ライブラリ
- サードパーティ(外部ライブラリ)
- 自作パッケージ それぞれのグループの間に空行を入れます。
import os
import sys
import requests
from myapp.service import fetch_user
Python相対importの乱用は避け、絶対importを基本に
# 推奨:絶対import
from myapp.utils import slugify
# 相対は最小限
from .utils import slugify
Python空行・コメント・docstring(文脈を正しく付ける)
空行で構造を区切る
トップレベルのクラスや関数の間は2行、クラス内のメソッド間は1行を目安に。
def a():
...
def b():
...
Python行末コメントは控えめに、説明は上に
# 悪い例:行末でダラダラ説明
value = compute(x) # ここで複雑なロジックが動いて...
# 良い例:一行上に簡潔に
# 複雑なロジック:キャッシュを参照後に再計算
value = compute(x)
Pythondocstringで「何をするか」「引数と戻り値」を簡潔に
def fetch_user(user_id: str) -> dict:
"""ユーザー情報を取得する。
Args:
user_id: ユーザーID
Returns:
ユーザー情報の辞書
"""
...
Pythonよくある落とし穴と安全な書き方(例外・比較・関数設計)
None等との比較は is / is not を使う
if value is None:
...
Python真偽の比較は == True/False を避ける
if is_valid: # 良い
if is_valid == True: # 悪い
Pythonミュータブルなデフォルト引数は使わない
# 悪い
def add_item(item, items=[]):
items.append(item)
return items
# 良い
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
Python例外の捕捉は広すぎない・メッセージは簡潔に
try:
r = requests.get(url, timeout=5)
r.raise_for_status()
except requests.HTTPError as e:
logger.error("HTTPエラー: %s", e)
PythonPEP8を守るためのツール活用(機械でチェック&整形)
チェック(pycodestyle / flake8)
コマンド一発でPEP8違反を検出できます。CIに組み込むと継続的に品質を維持できます。
pip install flake8
flake8 .
自動整形(black / autopep8)
まずblackで強力に整える、微修正はautopep8でも十分です。
pip install black
black .
例題(PEP8前後でコードを整える)
Before:詰まり・命名・改行がバラバラ
def Calc(a,b):return a+b
def getUser(id):
import requests,os
r=requests.get("https://httpbin.org/get",timeout=5);
if r.status_code==200: print("OK");return r.json()
else: print("NG");return None
PythonAfter:PEP8準拠で読みやすく
import requests
def calc(a: int, b: int) -> int:
"""2数の和を返す。"""
return a + b
def get_user(user_id: str) -> dict | None:
"""ユーザー情報を取得。成功時は辞書、失敗時はNone。"""
resp = requests.get("https://httpbin.org/get", timeout=5)
if resp.status_code == 200:
print("OK")
return resp.json()
print("NG")
return None
Python- 関数名・引数名はスネークケース
- importは先頭にまとめる
- 1行1ステートメント、条件分岐を明確に
- docstringで目的を簡潔に
まとめ(まず「最低限の型」を体に入れる)
PEP8の核心は「誰が読んでも同じに見える」揃え方です。インデント4スペース、79文字以内の行長、適切な空白、命名規則、importの順序、空行・コメント・docstringの基本を守るだけで、コードの質とチームの速度は上がります。ツール(flake8/black)で機械的に補助し、例外や比較などの落とし穴は定番パターンで回避する。まずは日々書くコードを“After”の型へ寄せていけば、PEP8は自然と身につきます。
