Python コーディング規約

## Pythonコーディング規約
本記事ではPythonのコーディング規約に関する情報を記述する。
コーディング規約とは、チーム開発を行う際に、コード上のコメントの記述や関数、変数の定義時のルールを決めることで、コードの見た目を均一に整え、レビュー等を行いやすくするために決められる。
コーディング規約を決める際の指標として下記３点をまとめる。

* PEP8
* Flake8
* Black

### PEP8
PEP8とはPythonのスタイルガイドである。
スタイルガイドとは、インデントや空白などのコードの見た目に関するもの、コメント、関数や変数の命名などの基本ルールを定義したコーディング規約のこと。

- コードのレイアウトに関するルール
読みやすく、見た目に一貫性があるコードを目指すための指針。

    - ***インデント***
      基本のインデントは半角スペース４文字
      カッコ内部で改行した際のインデントについては下記コードを示す。
      ~~~
      ＜正しい例＞
      - カッコの先頭に揃えるパターン
      def correct_indent1(var_one, var_two
                          var_three, var_four):

      - 先頭の値を縦で揃え、定義の初めの位置に閉じカッコを揃えるパターン
      num_list = [
          1, 2, 3,
          4, 5, 6,
      ]
      ~~~
      ~~~
      ＜誤った例＞
      - 引数が揃っていないパターン
      def miss_indent1(var_one, var_two,
              var_three,
              var_four):
          print('test')

      - 引数は揃っているが関数内部の行と同じインデントのパターン
      def_miss_indent2(
          var_one, var_two,
          var_three, var_four):
          print('test')
      ~~~

    - ***空白***
    空行については下記ルールが定義されている
        - トップレベルの関数やクラスの間は、２行空ける
        - クラス内のメソッドの定義は、１行空ける

    - ***import文***
    import文については下記ルールが定義されている
        - 異なるモジュールはimport文を分ける
        - 次の順番でグループ化する
            1. 標準ライブラリ
            1. サードパーティに関連するもの
            1. ローカルライブラリ

    - ***空白***
    空白については下記ルールが定義されている
        - 余計な空白文字は使わない
        - 代入演算子や比較演算子などの両側に１つ空白を入れる
        - カンマの後ろに空白を入れる
        - 同じカッコなどの終わりを表す文字の前に空白を入れない


- コメントに関するルール
コメントで重要なことはコードと矛盾しないこと。
コード修正時はコメントも更新する必要がある。
コメントの書き方の例として３つ紹介する

    - ***ブロックコメント***
    ブロックコメントは説明したいコードの前の行に書くコメント。
        - コードと同じインデント
        - １つの#と１つの空白の後ろに書く

    - ***インラインコメント***
    インラインコメントは、コードと同じ行に書くコメント。
        - コードとコメントの間に２つ以上の空白
        - １つの#と１つの空白の後ろに書く

    - ***docstring***
    docstringとは、モジュール、関数、クラス、メソッドについて説明を書くコメント。
        - よりよく書くためのルールがPEP257にまとめられている
        - 関数やメソッドの説明はdefの直後に書く
        - """で始まり、"""で終わる行
        - 説明が複数行の場合は、１行目の後に空行を置く

- 命名に関するルール
PEP8での命名規則を下記表に示す。

|用途|スタイル|用例|
|:--|:--:|:--:|
|パッケージとモジュール名|lowercase|system, datetime|
|クラス名|CamelCase|TestCase, HTTPRequest|
|関数、変数名|lowercaseまたは、lower_case_with_underscores|testnum、test_def|
|定数|UPPERCASEまたは、UPPER_CASE_WITH_UNDERSCORES|MINVALUE、MAX_VALUE|
|例外の名前|CamelCase、末尾にError|ClientApiError|


### Flake8
Flake8はコーディング規約であるPEP8に準拠しているか、不具合のもとになる箇所がないかを静的コード解析を行うツールである。

- Flake8のインストール
Flake8は下記コマンドを実行することでインストールできる
~~~
pip install flake8
~~~

- 静的コードチェックコマンド
静的コード解析実行コマンドを下記に示す。
~~~~
＜特定のファイルを解析＞
flake8 ファイルパス

＜フォルダ内のPythonファイルを解析＞
flake8 フォルダパス
~~~~

- エラーコード
エラーコード一覧は下記記事が大変参考になります。

https://qiita.com/KuruwiC/items/8e12704e338e532eb34a


- オプション
主要なオプションを下記に示す。

|オプション|概要|使用例|
|:--|:--:|:--:|
|ignore|特定のエラーを無視|flake8 --ignore=E203, E501|
|exclude|チェックの対象から除外|flake8 --exclude=.env, doc/build|
|max-line-length|１行の最大文字数指定|flake8 --max-line-length=80|
|max-complexity|複雑度を設定しチェック|flake8 --max-complexity=10|


### Black
Blackは妥協のないコードフォーマッターである。
PEP8の規約をもとに、PEP8で明確に定められていない項目についても独自に定めた規約にコードを自動整形するツール。
変更もできないため、コーディング規約で議論する必要がなくなるメリットがある。

- インストール
~~~
pip install black
~~~

- 実行コマンド
~~~
black ファイルパス
~~~

- オプション
主要なコマンドラインオプションを下記に示す。

|オプション|概要|
|:--|:--|
|-l, --line-length|１行の最大文字数|
|--check|ファイルをチェックし結果を出力する。ファイル修正はしない|
|--diff|ファイルをチェックし差分を出力する。ファイル修正はしない|
|--include|チェックしたいファイルやディレクトリを正規表現で指定|
|--exculde|除外するファイルやディレクトリを正規表現で指定|