コーディング規約

コーディング規約とは

全く同じ機能を持つシステムでも、コードは複数の書き方ができる。チームで開発する場合、人によってコードの書き方にばらつきがあると可読性が下がってしまうため、コードの書き方が全体で統一されるようにコーディング規約が定められていることが多い。コーディング規約は、会社やプロジェクトごとに異なるが、本記事ではPythonの標準ライブラリで利用されているPEP8をもとにコーディング規約の一例を紹介する。あくまでもコードを読みやすくするための指針にすぎないなので、チーム内で合意が取れている場合は以下で示す書き方に固執する必要はない。

命名規則

  • i, j, kなどの1文字の名前は使わない。
  • # 悪い例
    animals = ['dog', 'cat']
    for i in animals:
        pass
    
    # 良い例
    animals = ['dog', 'cat']
    for animal in animals:
        pass

    名前は可能な限りドメインを表現したものにする。わかりにくい略称は使わない。

    # 悪い例
    aaa = 'John'
    cnt = 10
    
    # 良い例
    name = 'John'
    count = 10
  • 関数名、クラス名などの命名規則は以下の表に準ずる。
  • 命名規則
    パッケージ名すべて小文字で表記。mypackage
    クラス名・例外名単語の頭文字のみ大文字で表記MyClass
    モジュール名・関数名・メソッド名・変数名すべて小文字で表記。単語の区切りにアンダースコア(_)を使用。my_function
    定数名すべて大文字で表記。単語の区切りにアンダースコア(_)を使用。MY_CONSTANT

    インポート文

  • import文はスクリプトの先頭にまとめて記載する。
  • import os
    import sys
    
    
    def main():
        pass
    
    
    if __name__ == "__main__":
        main()
  • import文の順番は「標準ライブラリ → サードパーティー → 自作モジュール」の順に記載する。
  • import os
    import sys
    
    import flask
    
    import mylibrary
    
    
    def main():
        pass
    
    
    if __name__ == "__main__":
        main()
  • 1つのimport文で複数のライブラリをインポートしない。
  • # 悪い例
    import os, sys
    
    # 良い例
    import os
    import sys

    if文

  • elseがある場合、判定式には肯定表現を使う
  • # 悪い例
    if x != 0:
        print("xは0でない")
    else:
        print("xは0")
        
    # 良い例
    if x == 0:
        print("xは0")
    else:
        print("xは0でない")
  • 否定を使う場合は、読みやすいように”if a is not b”の形を使う。
  • # 悪い例
    if not x is None:
        pass
    
    # 良い例
    if x is not None:
        pass
  • ブール値のTrueかFalseの確認に比較演算子(==)は使わない。
  • # 悪い例
    if bool_value == True:
        pass
    
    # 良い例
    if bool_value:
        pass

    レイアウト

  • 行の終わりにセミコロンはつけない。
  • # 悪い例
    x = 1;
    
    # 良い例
    x = 1
  • 1行の長さは79文字以下にする。ただし、コメントや Docstringのような構造の制約の少ないテキストについては72文字以下にする。
  • # 悪い例
    def func(a, b, c, d, e, f, g, h, i, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z):
        pass
    
    
    # 良い例
    def func(
            a, b, c, d, e, f, g, h, i, k, l, m,
            n, o, p, q, r, s, t, u, v, w, x, y, z
        ):
        pass
  • インデントにはタブではなくスペース4つを用いる。
  • for count in range(100):
        print(count)

    ※ VSCodeでは、標準でタブがスペースに変換される設定になっているので特に意識する必要はない。


  • 代数演算子、比較演算子、ブール値の前後とコロンやカンマの後ろにスペースを入れる。
  • # 悪い例
    int_val=10+20
    dict_val={'a':1,'b':2}
    int_val==dict_val
    
    # 良い例
    int_val = 10 + 20
    dict_val = {'a': 1, 'b': 2}
    int_val == dict_val
  • ただし、引数の指定、コロンの前、()や{}の前後にはスペースを入れない。
  • # 悪い例
    if 10 > 3 :
        pass
    
    
    # 良い例
    if 10 > 3:
        pass
    # 悪い例
    def func(arg1, arg2 = 1):
        return arg1 + arg2
    
    func(arg1 = 10)
    
    # 良い例
    def func(arg1, arg2=1):
        return arg1 + arg2
    
    func(arg1=10)
    # 悪い例
    x = ( 1 + 2 )
    
    # 良い例
    x = (1 + 2)
  • 改行には括弧を使い、バックスラッシュは使わない。
  • # 悪い例
    num = 10 + 20 + 30 + 40 + \
    50 + 60 + 70
    
    # 良い例
    num = (
        10 + 20 + 30 + 40
        + 50 + 60 + 70
    )
  • 改行する際は、インデントをつけて改行部分を明確にする。
  • # 悪い例
    def func(
        arg1,
        arg2,
        ):
        return arg1 + arg2
    
    
    # 良い例
    def func(
            arg1,
            arg2,
        ):
        return arg1 + arg2
  • クラス内のメソッドの間には1行、インポート文、関数、クラスの間には2行の改行を入れる。
  • import os
    import re
    
    
    class Class1():
    
        def func1(self):
            pass
            
        def func2(self):
            pass
    
    
    class Class2:
    
        def func1(self):
            pass
            
        def func2(self):
            pass
    
    
    def func1():
        pass
    
    
    def func2():
        pass
  • エントリポイント(プラグラムの処理開始地点)はmain関数内に記載する。
  • # 悪い例
    data = load_data()
    output = process(data)
    save(output)
    
    
    # 良い例
    def main():
        data = load_data()
        output = process(data)
        save(output)
    
    
    if __name__ == "__main__":
        main()

    VSCodeでLinterやFormatterを利用する

    コードを静的に解析してルールに従っているか確認、修正するために、LinterやFormatterを利用すると便利である。この記事では代表的なLinter/Formatterとして、Mypy、Flake8、Black Formatterを紹介する。

    ライブラリ名説明ドキュメント
    MypyPythonコードの型チェックができるライブラリ。 宣言した型通りの値が渡されているか確認してくれる。Mypy Doc
    Flake8Pythonコードのエラーチェックができるライブラリ。 PEP8に従っているかや論理エラーがないかなどを確認してくれる。Flake8 Doc
    Black FormatterPythonコードのフォーマット修正ができるライブラリ。 PEP8のサブセットであるブラックコードスタイルに従い、 コードを自動で修正してくれる。Black Formatter Doc

    VSCodeでは、Mypy、Flake8、Black Formatterを簡単に利用できるよう拡張機能が用意されている。

    Mypy

  • 拡張機能「Mypy Type Checker」をインストールする
  • Notion Image

  • pyファイルを作成すると型チェックが有効になっていることが確認できる
  • Notion Image

    Flake8

  • 拡張機能「Flake8」をインストールする
  • Notion Image

  • pyファイルを作成するとエラーチェックが有効になっていることが確認できる
  • Notion Image

    Black Formatter

  • 拡張機能「Black Formatter」をインストールする
  • Notion Image

  • pyファイルを上で右クリックして、「ドキュメントのフォーマット」を押すとコードが自動修正される
  • Notion Image

    ▼修正後

    Notion Image

  • ファイル保存時にコードを自動修正されるように設定したい場合は、「設定」>「Editor: Format On Save」にチェックを入れる
  • Notion Image

    Notion Image

    参考資料



    著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.