【Python】コードの記述方法(コーディング規約:PEP8)

時計 2021.10.16 / 時計

【Python】コードの記述方法(コーディング規約:PEP8)

本記事ではPythonにおける、コーディング規約(スタイルガイド)のPEP8に則ったコードの記述方法について解説していきます。

そもそもPythonのコードは構文が正しい限りは自由に記述して問題ないです。

ただ美しい(読みやすい)コードを記述したい、他のプログラマと同じルールの元コードを記述したい、という方はPEP8というスタイルガイドに従うといいです。

ここではPEP8に記載されている規則のうち重要な部分を説明しております。

本記事を通して以下の知識を学べます。

学べる知識
  • PEP8(コーディング規約)について
  • コードのレイアウト
  • 式と文の規則
  • インポートの規則
  • 関数や変数、クラスなどの命名規則

PEP8

PEP8とは

PEP8(Python Enhancement Proposal #8)とは、Pythonでのコードの記述方法を記したガイドライン(コーディング規約)です。

IT用語の確認

コーディング規約とは、プログラミング言語を用いてコードを記述する際に、プログラマが順守した方がよいコードの記述規則です

PEP8は必ず従わなければいけないものではないです。しかしPEP8に従うことによって次のようなメリットを享受できます。

  • コードの可読性が上がる
  • 他のPythonプログラマと同じスタイルで記述できる
  • 他のPythonプログラムが理解しやすくなる
  • コードの変更作業が簡単になる

基本的にはPEP8に従ってコードを記述することをお勧めします。

特にチームで作業を行っている場合は、チームメンバーが読みやすいコードを書く必要がありますので、PEP8に従いましょう。
もちろんチーム(プロジェクト)で独自の規則があるならば、そちらを優先してください。

PEP8に記載されているコーディング規約

PEP8で定められているコーディング規約は大きく分けると次のようになります。
(実際にはもっとありますが、重要な部分のみを抜粋しています。)

  • レイアウト
  • 式と文
  • インポート
  • 命名規則

次項よりそれぞれの規約について詳しく解説していきます。

レイアウト

インデント

Pythonにおいてインデント(字下げ)は非常に重要な意味を持ちます。

C言語では、複数の文を1つのブロックとして記述するときに「{}」(波かっこ)を利用します。

if (x > y) {
    printf("x > y");
} else {
    printf("x < y");
}

Pythonでは波かっこは使わずにインデントでブロックを表します。

if x > y:
    print('x > y')
else:
    print('x < y')

このインデントが間違っているとIndentationErrorが発生します。

規約にはインデントにはタブではなく空白を使うこと、そしてインデントに4個の空白を使うことが明示されています。

改行後のインデント

Pythonでは改行は文の終わりを意味します。

C言語やJavaではセミコロンが文の終わりを意味していたので、それら言語に慣れている人はよく間違えます。

しかしPythonでも文の途中で改行してもよい場面があります。
それは括弧を使いブロックを明示しているときです。

1文の途中で改行した場合は、インデントの方法がいくつかあります。

まず1つ目に、次のようにインデントを開始区切り文字に合わせます。

def function(first_name, last_name,
        age, address):
    return first_name

2つ目に、次のように開始区切り文字の直後に改行を行い、1つインデントを加えます。

def function(
        first_name, last_name,
        age, address):
    return first_name

person = function(
    office, five, 54, Japan)
注意点

引数とコードのインデントが合わないように引数部分はインデントをもう一つ(空白を4つ)追加します

そのため次のような記述はPEP8では間違いです。

# 区切り文字に続けて引数を指定する場合、改行後は区切り文字に揃える
person = function(office, five,
    54, Japan)

# 引数のインデントをもう一つ深くする
def function(
    first_name, last_name,
    age, address):
    return first_name

リストの場合は以下どちらの記述方法でも構わないです。

list1 = [
    1, 2, 3,
    4, 5, 6,
    ]

list2 = [
    1, 2, 3,
    4, 5, 6,
]

1行の長さ

コードの1行の長さは79文字以下にします。

ですが無理やり79文字以下にしなくてもかまいません。また1文が79文字以上になる場合、バックスラッシュを差し込むことで改行は許容されます。

空白行

コードの可読性を上げるために空白行を入れることはとても重要です。

空白行の重要な使い方の一つにトップレベルの関数とクラスの間に2つの空白行を挿入するというのがあります。

class ClassOne:
    pass


class ClassTwo:
    pass


def my_function():
    return None

次にクラス内の関数はそれぞれ1つの空白行を挿入します。

class ClassOne:
    def method_one(self):
        return None

    def method_two(self):
        return None

式と文

演算子

代入演算子や比較演算子、ブール値(and、or、not)の前後には1つのスペースを入れます。

foo = 1 + 1

しかし引数にデフォルト値を代入する場合はスペースは必要ありません。

def function(first_name=”office”)

式中に複数の演算子が存在する場合は、最も優先度が低い演算子の前後に空白を入れます。

# 正しい
y = (x+y) - (y-x)
if y>5 and y<15:
    print(y)
# 間違え
y = (x + y) - (y - x)
if y > 5 and y < 15:
    print(y)

括弧・ブランケット・波括弧

開始記号の直後や終了記号の直前にスペースは入れないようにしましょう。

# 正しい
function(office[54], {y:2})
five = (5,)

# 間違え
function( office[ 54 ], { y:2 } )
five = (5, )

カンマ・コロン・セミコロン

カンマ・コロン・セミコロンの直前にはスペースは入れず直後にスペースを入れます。

# 正しい
if y == 5: print y, x + y; x, y = y, x

# 間違え
if y == 5 : print x , x + y ; x , y = y , x

スライスの場合は前後にスペースは入れません。

# 正しい
office[4:5]

# 間違え
office[4: 5]

式の否定

notで式を否定する場合、if a is not bの形を使う。

# 正しい
if y is not None:
    pass

# 間違い
if not y is None:
    pass

if a is not bとif not a is bは機能面は同じですが、可読性の良い前者を利用するようにしましょう。

空値のチェック

空値かどうかを確認する際に、シーケンス(リストや文字列など)の長さをチェックはせずに、Falseであるかでチェックします。

# 正しい
if not mylist:
    pass

# 間違い
if len(mylist) == 0:
    pass

ブール値の確認

式がブール値のTrueまたはFalseかを確認するときに比較演算子(==)は使用しません。

# 正しい
if bool_value:
    return 'True'

# 間違い
if if bool_value == True:
    return 'True'

インポート

先頭に記入

import文は特別なことがない限り、スクリプトの先頭に記入します。

import文の順番は次の流れで記載し、グループで分けます。

  1. 標準ライブラリ
  2. サードパーティー
  3. 自作したモジュール

それぞれのグループは1行の空行を入れます。またグループの中でも、アルファベット順に記載します。

行を分ける

1つのimport文で複数のライブラリをインポートしないようにします。

# 正しい
import openpyxl
import os

# 間違え
import openpyxl, os

モジュールの絶対名を使う

モジュールの絶対名でインポートを行うようにします。

例えばパッケージofficeからモジュールfiveをインポートする際は次のように記述します。

from office import five

命名規則

Pythonだけでなくすべてプログラム言語で共通することですが、変数やクラス・関数などにそれぞれ異なった名前を付ける必要があります。

PEP8では見た目で名前がどの種類に対応しているのかを分かるように、命名規則を設定しています。

命名規則には次のような種類があります。

  • 小文字一文字(例:a)
  • 大文字一文字(例:A)
  • すべて小文字(例:lowercase)
  • 小文字で単語毎をアンダーバーで繋げる(例:lower_case)
  • すべて大文字(例:UPPERCASE)
  • 大文字で単語毎をアンダーバーで繋げる(例:UPPER_CASE)
  • 単語の先頭を大文字にして繋げる(例:CapitalizedWords)
  • 始めの単語が小文字で次に続く単語の先頭が大文字(例:mixedCase)

また名前を付ける際に注意すべき事項があります。

  • 1文字目に数字は使えない
  • アンダーバー(アンダースコア)以外の半角記号は使用できない
  • 予約語(andやbreakなど)は使えない

上記の注意事項とこれから説明する命名規則を元に名前を付けていきます。

クラスと例外

クラスと例外の名前は、単語の先頭を大文字にして繋げる方式(CapitalizedWords)を使用します。
このスタイルをキャメルケースと呼びます。

例:MyClass, Office

クラス名はアンダースコアで区切ることはしません。

パッケージ名とモジュール名

Pythonのパッケージとモジュールにはすべて小文字の短い名前にします。

例:mypackage, module.py

モジュールに関しては、名前にアンダーバーを使っても大丈夫です。

例:module_name.py

関数と変数

関数と変数の名前は、すべて小文字にする、またはすべて小文字にして単語をアンダーバーで繋げます。

例:x、function、function_name

スクリプトがPEP8に従っているかの確認

Pythonで作成したスクリプトがPEP8に順守しているか確認する方法として、pep8というのがあります。

pep8を利用するためにはpipでインストールする必要があります。

pip install pep8

確認したいスクリプトまで移動して、次のコマンドを実行します。

pep8 ファイル名

上記を実行すると、スクリプトがコーディング規約に則って記述されているか結果を出力します。

ソースコードも含めて出力したいときは、オプションとして--show-sourceを追加します。

pep8 ファイル名 –-show-source

より詳細な結果が欲しい場合は、オプションに—show-pep8も追加します。

pep8 ファイル名 –-show-source –-show-pep8

スクリプトを自動的にPEP8に対応するコードにしたい場合は、autopep8を利用します。

pip install autopep8

次のコマンドを実行すると、自動的に対象のスクリプトをPEP8に対応したコードに変換してくれます。

autopep8 ファイル名

まとめ

本記事「【Python】コードの記述方法(コーディング規約:PEP8)」はいかがでしたか。

これからPythonを学ぶという人は、ぜひPEP8に従ってコードを書いていってください。

もちろんPythonをずっと学んできた人も、今からでもPEP8を身に着けて、誰にでもわかりやすいコードを書けるようにしていきましょう。