Pythonのお作法「pep8」とは
プログラムのコーディングスタイルとは
プログラムを正しく実行させるには、決められたルールの元、記載しなければいけません。
ガイドラインpep8
Pythonの場合、関数の宣言する場合はdefから宣言する事や、インデントを活用してプログラムのブロックを定義する等、様々な書き方のルールであるコーディングスタイルというのが決められています。
Pythonのコーディングスタイルは公式にpep8というガイドラインが決められています。
https://pep8-ja.readthedocs.io/ja/latest/
本稿では、基本的なコード(ルール通りじゃないと実行されない)の記載方法は省略し、個人、そしてグループでコーディングする際の以下の部分に焦点を当てて解説していきたいと思います。
- 一貫性
- 視認性
- 読解性
構成
様々な種類(機能)のコードを記載しますが、pep8では全体の大まかな記載する順序が決まっています。
記載順
- Doc String
- モジュールコメント
- モジュール
- グローバル変数
- 関数 or クラス (トップレベル)
Doc String
Doc Stringはモジュールや関数、クラス、メソッドが何をしているかを解説するコメントの事を示します。
記載例
"""
Doc String
"""
# 標準モジュール
import os
globalstring = exsample
def function():
pass
インデントの方法
インデントはPythonにとってコードをブロック化するのに重要な要素です。
インデントの方法
コード記載の際にインデント方法は以下の2通りが選択出来ます。
- タブキー
- スペースキー
pep8ではスペースキーの使用が定義されています。
ただ、実際にインデントを挿入する場合、スペースキー連打する事は無く、Visual Studio Code等のソフトウェアの支援を利用します。
タブキーを押すと、自動でスペース4つ入力されます。
※スペース数が多かった場合はオプションで変更可
また、スペースを使用すると、文字間を移動する際に矢印キーでカーソルを押す回数が増えがちですが、Visual Studio CodeではCtrl + 矢印キーにより一気文字間を移動する事が可能です。
インデントのスペース数
コード内ではインデントはスペースの数によって定義されます。
スペースの数
通常、インデントのスペースの数は以下の2通りから選択されます。
- 4つ
- 8つ
pep8では4つの使用が定義されています。
個人的にもインデントが深すぎると見づらいので4つが好みでもあります。
1行の長さ
1行の文字数は厳格性や用途によりいくつかのルールに分かれます。
長さのルール
種類 | 厳格性 | 文字数 |
---|---|---|
通常のコード | 可能なら | 79文字 |
通常のコード | 厳格 | 99文字 |
コメントやDoc String | 厳格 | 72文字 |
上記の通り、通常のコード部分に関しては最も厳格なルールにするのでしたら79文字以内にするべきです。
ただし、実際はその文字数以内は難しい場合が多く、最大でも99文字以内が現実的でしょう。
コメントやDoc Stringは、文字数の調整がしやすいのもあり厳格に72文字以内にします。
改行するテクニック
1行を規定の文字数以内にするには、上手く改行する必要があります。
プログラムの都合上そのまま改行してはコードのブロックが定義され、実行エラーに繋がります。
PYthonではバックスラッシュ(\)を文末に記載すると改行をしても、次の行が続きとして定義されます。
バックスラッシュがいらない場合もインデントを活用して、1行の文字数を制限以内にするようにします。
記載例1
if文などで条件式を複数記載する場合は、バックスラッシュを使用して条件毎に分けます。
if i == 0 \
or i == 1 \
or i == 2 \
or i == 3:
print ('iは1か2か3です')
記載例2
演算子を使用する場合は、インデントを使用して演算子毎に分けます。
test = (string1
+ string2
- string3
- string4)
エンコーディング宣言
コードがどのような文字のエンコーディングで記載されたのかを定義するのがエンコーディング宣言です。
宣言の必要性
Python2.xまでは、1行目に以下のような宣言を記載して、コードのエンコーディングを定義していました。
-*- coding: utf_8 -*-
Python3.xからはこの記載は不要と定義されてます。
その代わり、常にUTF-8を使用する事が義務化されています。
ファイル保存や作成する際に定義し忘れないように注意しましょう。
import
モジュールをロードするためのimportの使用方法です。
優先順位と宣言方法
優先順位
始めにimportでロードするモジュールの優先順位です。
記載する順序は以下になります。
- 標準ライブラリ
- サードパーティ
- ローカルライブラリ(自作等)
宣言方法
基本的にはimportを使用するようにします。
fromを併用しても最後にはimportを使用してモジュールを明示します。
import os
from package import module
from package.module import function
逆に以下のような使用法はNGとなっています。
import sys, os
from package import *
空行
改行を2回以上挿入して、空行を挿入する場合があります。
空行の数は以下の場合により数を使い分けます。
空行の数
種類 | 空行数 |
---|---|
関数(トップレベル) | 2行 |
クラス(トップレベル) | 2行 |
クラス内のメソッド(関数) | 1行 |
importの種類毎 | 1行 |
関数内 | 空行無し |
引用符
文字列を扱う際に使用する単一引用符'
と二重引用符"
の扱い方です。
どちらを使用するか
pepではどちらを推奨するかは決まっていません。
どちらかに統一して使用するのが望ましいでしょう。
ただし、三重引用符を使用してコメントアウトやDoc Stringの場合は二重引用符を3つ並べたもの"""
を使用します。
空白
コード全体で使用する半角空白の使用方法です。
基本的には余計な空白を使用しないのが定義になります。
空白のルール
括弧 / カンマ・セミコロン・コロンの直前
# 正しい
foo = (test1)
foo = (test1, test2)
# 間違い
foo = ( test1 )
foo = ( test1 , test2 )
関数 / リスト・辞書型後の括弧
# 正しい
func(arg)
dct['key'] = lst[index]
# 間違い
func (arg)
dct ['key'] = lst [index]
変数への代入等で使用する演算子
タブキーで演算子位置を揃える事が可能ですが、こちらも余計な空白の使用しないのが定義されています。
個人的には揃っていたほうが見やすいのですが。
# 正しい
x = 1
y = 2
abcdefg = 3
# 間違い
x = 1
y = 2
abcdefg = 3
演算子の左右に値
演算子の左右に空白を入れます。
この際、片方だけ空白があるという事にはせず、左右が同一の空白にします。
# 正しい
foo[lower:upper]
foo[lower+offset : upper+offset]
foo = (a+b) * (c+d)
# 間違い
foo[lower: upper]
foo[lower + offset : upper + offset]
foo = (a + b) * (c + d)
関数の引数
# 正しい
def func(arg=0.0):
pass
# 間違い
def func(arg = 0.0):
pass
末尾のカンマ
タプルやリスト、関数の引数等の場合に、複数の要素を定義する場合には各要素の末尾にカンマを記載します。
末尾のカンマ
要素が1つの場合は必須、複数の場合は任意ですが、視認性やバージョン管理でのコラボレーションを考慮する付加した方が良いと思います。
# 正しい
lst = [test1,]
lsts = [
test1,
test2,
]
# 間違い
lst = test1,
lsts = [test1,test2,]
コメント
#
で始まるコメントの使用方法です。
コメント
言語
ソースコードが自身の言語しか話さない人にしか見せない場合以外は、英語で記載するようにしましょう。
ブロックコメント
コメント後のコードの説明をするのがブロックコメントです。
#
の後半角空白を1つ入れてコメントを記載します。
# コメント
インデントがされている箇所へのコメントは、コメントも同様にインデントで合わせます。
# コメント関数
def func():
# コメント関数内コード
pass
インラインコメント
コードの直前に記載したブロックコメントに対し、コードの横に記載するのがインラインコメントです。
コードとインラインコメントの間には半角空白を2つ以上を記載します。
foo = x + y # コメント
命名規則
変数や関数等の名称を、大文字や小文字、アンダースコア_
等を使い分ける方法です。
命名規則
命名パターン
記載パターン | 記載例 |
---|---|
小文字 |
lowercase |
小文字 + アンダースコア
|
lower_case_with_underscores |
大文字 |
UPPERCASE |
大文字 + アンダースコア
|
UPPER_CASE_WITH_UNDERSCORES |
頭文字大文字(単語区切り) |
CapWords |
頭文字小文字 + 次の単語から頭文字大文字
|
mixedCase |
いくつかのパターンがありますが、以下のパターンは使用しないようにしましょう。
頭文字大文字
+ アンダースコア(単語区切り)
例) Capitalized_Words_With_Underscores
種類毎の使い分け
パッケージ・モジュール
小文字
+ 短い名称
にします。
アンダースコアは不使用とします。
# 命名例
import pkg
import mdl
クラス
頭文字大文字(単語区切り)
を使用します。
# 命名例
class ClassName():
pass
関数・変数
小文字
のみが基本として、視認性向上のために必要に応じてアンダースコア
を使用します。
メソッド(Class内の関数)も同様です。
# 命名例
val = 'test1'
def function_test():
pass
定数
定数は中身が変化しない数値にあたります。
大文字
を使用します。
PI = 3.14
MAX_BUFFER_SIZE = 1024
Discussion