【PEP8】Pythonのソースコードを規約に乗っ取ってキレイに書く

# 始めに
プログラム言語の紹介サイトなどを見ると、Pythonは行儀のいい言語などと記載されているのを見かけます。Pythonは他言語に比べると書き方の制約が多い印象を受けますが、それでもやはり自由度は高く、実際開発を行ってみると各プログラマ固有のクセがソース内に大量に残存してしまいます。

これは個人の趣味程度であればさほど重要な問題ではありませんが、仕事、特にチーム開発の場合には由々しき問題です。一度開発したものは基本的に何年と保守せねばならず、その中で保守担当者が変わることもよくあることです。後々の保守を考え、プログラム規約をプロジェクト内で定義しておくことは非常に重要な事となります。

プロジェクトごとに規約を定義する場合には一から作成することも手としてありです。しかしながら時間およびコストが掛かってしまうため、PEP8をベースとしてコーディング規約を作成することが多々ありますのでご紹介させて頂きます。


# PEP8とは
PEP8とは「コードは書くよりも読まれることの方が多い」という考えの元に作成されたPythonのコーディング規約です。この規約に乗っ取ることでコードを読みやすくするとともに、各プログラマによって作られたコードのスタイルを一貫させることを目的としています。

なおPEP8では必ずしも本規約に従う必要がないという姿勢を示しています。プロジェクトの特性に合わせて柔軟に規約を作成していくのが良いかと思います。

```
しかし、一貫性を崩すべき場合があることも知っておいてください
つまり、このスタイルガイドが適用されない場合があります。
疑問に思ったときは、あなたの判断を優先してください。
他の例を調べ、一番良さそうなものを決めて下さい。
```

# 使い方
PEP8自体は規約ですが、この規約に則ってコードを記載できているか簡単にチェックできる仕組みが提供されています。

- 環境設定  
pipでインストールできます  

```
pip install pep8
```
- 実行  
引数に対象のソースコードを指定して、pep8コマンドを叩きます

```
pep8 test.py 
```
- 結果  

```
test.py:16:1: E302 expected 2 blank lines, found 1
test.py:22:80: E501 line too long (95 > 79 characters)
test.py:27:1: E302 expected 2 blank lines, found 1
test.py:39:1: E302 expected 2 blank lines, found 1
test.py:44:11: E225 missing whitespace around operator
test.py:46:12: E225 missing whitespace around operator
test.py:47:13: E225 missing whitespace around operator
test.py:50:27: W291 trailing whitespace
test.py:51:34: W291 trailing whitespace
test.py:60:45: W291 trailing whitespace
test.py:66:16: E231 missing whitespace after ':'
test.py:74:80: E501 line too long (90 > 79 characters)
test.py:90:10: E231 missing whitespace after ','
test.py:92:56: E231 missing whitespace after ','
test.py:101:1: W391 blank line at end of file

```

# 規約内容について
規約について一部を紹介します。

### インデント
- 1インデントはスペースを4つ使う。  
 
- 行を継続する場合は、折り返された要素を縦に揃える。
- 開き括弧に揃える

```Python  
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
```

- もしくは引数とそれ以外を区別するため、スペースを4つ加える

```Python
def long_function_name(
        var_one, var_two, var_three,
        var_four):
```

### タブorスペース
- スペースが好ましいインデントの方法。

### 行の長さ
- すべての行の長さを、最大79文字までに。
- 改行は括弧やブラケット、波括弧の中では暗黙のうちに行を継続させることを利用する
- バックスラッシュを使うことも可

```Python
with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())
```

### 空行
- トップレベルの関数やクラスは、2行ずつ空けて定義。
- クラス内部では、1行ずつ空けてメソッドを定義。

### ソースファイルのエンコーディング
- utf8を使用

### import 

- import文は、通常は行を分けるべき

```Python
#good: 
import os
import sys

#bad:  
import sys, os
```
- import文は、例外を除き絶対パスで指定

```Python
#good: 
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

#bad:  
from . import sibling
from .sibling import example
```

- importは以下でグループ化する。
  - 標準ライブラリ
  - サードパーティライブラリ
  - ローカルな アプリケーション/ライブラリ に特有のもの

### 式や文中の空白文字
- 基本的に式や文の中に文字は入れない

```Python
#good: 
spam(ham[1], {eggs: 2})
#bad: 
spam( ham[ 1 ], { eggs: 2 } )

#good: 
foo = (0,)
#bad: 
bar = (0, )

#good: 
spam(1)
#bad: 
spam (1)

#good: 
dct['key'] = lst[index]
#bad: 
dct ['key'] = lst [index]

#good: 
x = 1
y = 2
long_variable = 3
#bad: 
x             = 1
y             = 2
long_variable = 3
```


### 末尾のカンマ
- 末尾にカンマを付けるかどうかは、通常は任意。
- 要素数がひとつのタプルを作るときは例外的に必須。

```Python
#good
FILES = ('setup.cfg',)
```

# 参考
https://pep8-ja.readthedocs.io/ja/latest/