PEP8とは
PEP8は、Pythonのコーディング規約です。
以下3つの分類に分かれます。
- コードのレイアウト
- コメント
- 命名規約
※PEPはPython Enhancement Proposal(Python 拡充提案)
の略称。
前提事項
以下、PythonのプロジェクトにPEP8を導入する際の前提事項です。
- プロジェクトで独自の規約がある場合はそちらを優先すること。
- PEP8に準拠することによりコードの可読性が落ちる場合は、読みやすさを優先すること。
余談になりますが、PEP8のドキュメントの冒頭には以下記載があります。
一貫性にこだわりすぎるのは、狭い心の現れである
コードのレイアウト
インデント
- 1つのインデントを半角スペース4つで統一すること。(タブは使用しない)
def function_test()
print('test')
- 引数やリストで行が長くなる場合は改行し、括弧の開始部分に要素を合わせること。
# long_arg1とlong_arg3の開始位置を揃える。
hoge = row_long_function_test(long_arg1, long_arg2,
long_arg3, long_arg4,
long_arg5, long_arg6)
# 100000000と600000000の位置を揃える。
row_long_list = [100000000, 200000000, 300000000, 400000000, 500000000,
600000000, 700000000, 800000000]
# long_key1とlong_key3の位置を揃える。
row_long_dict = {'long_key1': 'long_value1', 'long_key2': 'long_value2',
'long_key3': 'long_value3', 'long_key4': 'long_value4'}
- 括弧の直後に改行する場合は、1つインデントを入れること。
# var_oneの前に1インデント入れる。
hoge = row_long_function_test(
arg_one, arg_two, arg_three, arg_four,
arg_five, arg_six)
# 100000000,700000000の前に1インデント入れる。
row_long_list = [
100000000, 200000000, 300000000, 400000000, 500000000, 600000000,
700000000, 800000000]
# long_key1,long_key3の前に1インデント入れる。
row_long_dict = {
'long_key1': 'long_value1', 'long_key2': 'long_value2',
'long_key3': 'long_value3', 'long_key4': 'long_value4'}
- 関数定義で引数が多く改行を入れる場合は、2つインデントを入れること。
# 引数部分で、2つインデントを加える。
def function_test(
arg_one, arg_two, arg_three,
arg_four):
print(arg_one)
(2つインデントを入れることで、引数部分とコード内容でインデントが揃ってしまい、区別が付きにくくなることを防ぎます。)
- if文が長くなる場合は括弧を加えて改行し、改行後にインデントを2つ入れること。
# 2行目以降の条件部分でインデントを2つ加える。
if (var_one == 100
and var_two == 200
and var_three == 300):
do_something()
(関数定義と同様に、条件部分とコード内容でインデントが揃ってしまい、区別が付きにくくなることを防ぎます。)
1行の長さ(文字数)
- 79文字以内にすること。
- コメントやdocstringは72文字以内にすること。
- 行が長くなる場合は、括弧や波括弧で囲い、複数行に分割すること。
複数の文を1行で書く
- 原則しないこと。
docstring
- non publicメソッド以外は書くこと。
改行
- トップレベルのクラスや関数は2行分の改行(空行)を入れること。
# クラス・関数ごとに2行空けます。
def function_test1():
print('test1')
def function_test2():
print('test2')
class SampleClass():
pass
- クラス内部の関数は1行分の改行(空行)を入れること。
class SampleClass():
def __init__(self):
pass
def function_test1(self):
print('test1')
- 二項演算子の前で改行すること。
# NG
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
# OK
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
importの書き方
- 行を分けて書くこと。
# NG
import os, sys
# OK
import os
import sys
クォーテーション
- シングルクォーテーション、ダブルクォーテーションどちらでも可能。(ただし、どちらかに統一すること。)
スペースの入れ方
- 余分なスペースは入れないこと。
# OK
spam(ham[1], {eggs: 2})
foo = (0,)
if x == 4: print(x, y); x, y = y, x
spam(1)
dct['key'] = lst[index]
x = 1
y = 2
long_variable = 3
# NG
spam( ham[ 1 ], { eggs: 2 } )
bar = (0, )
if x == 4 : print(x , y) ; x , y = y , x
spam (1)
dct ['key'] = lst [index]
x = 1
y = 2
long_variable = 3
ソースファイルのエンコーディング
- UTF-8を使用すること。
コメント
- コードを修正した場合は、コメントも更新すること。
- コメントはセンテンス(文)にすること。
- 次のセンテンスとの間には半角空白文字を2つ含めること。
- ブロックコメントの各行は「#」で始め、その後に半角空白文字を1つ含めること。
- インラインコメントの利用は極力控えること。
- 自明なことは書かないこと。
ブロックコメントの例
# 変数xの説明
x = x + 1
インラインコメントの例
x = x + 1 # 変数xの説明
命名規約
関数名,変数名
- 小文字のみで、単語間をアンダースコアで区切ること。
関数名の例
def sample_func():
return pass
変数名の例
word = "アイウエオ”
blur_word = "ぼかす”
クラス名
- キャメルケースで記述すること。
class SampleClass():
(キャメルケースとは、それぞれの英単語の先頭を大文字にする表記方法。)
参考
より詳しいPEP8の詳細は、 こちら のドキュメントをご参照ください。
以上で本記事の解説を終わります。
よいITライフを!