トップページに戻る

読みやすいPythonコードを書こう

はじめに

Pythonは可読性の高い言語だとよく言われます。インデントが強制されることで、分岐や繰り返し、関数のスコープなどが一目見ただけでわかるようになっています。

また、言語の特性上、非常に柔軟な書き方ができるため、目的の動作を実現することが簡単にコードに表現することができます。

しかし、これらの言語特性が裏目に出て、次のようなコードを量産する可能性もあります。

  • すぐ書けたけど、後日振り返ってみると読めない
  • 他の人が書いたPythonコードが全然読めない

このページでは、読みやすいPythonコードを書くためにはどうしたら良いか?ということを、私なりにまとめてみようと思います。

Python コードのスタイルガイド

PEP: 8 Python コードのスタイルガイド で公式のスタイルガイドが書かれています。

Guido の重要な洞察のひとつに、コードは書くよりも読まれることの方が多い、というものがあります。この文書で示すガイドラインの目的は、コードを読みやすくするとともに、Pythonで書かれた幅広いコードのスタイルを一貫させることです。PEP 20 にもあるように "可読性重要" です。

Guido さんは、Pythonの生みの親です。

仮に、「自分だけが読むコードだから自分だけ読めればいいんだよ!」のように言いながら、 意味をなさない変数名や、 複雑な引数と戻り値を持つ関数 を導入してしまう人がいます(昔の自分)。

そして、後日読み直してみると、何をやっていたか理解できない・・・。。(あるある

一週間後の自分ですら他人だと思ったほうが良いです。誰もが読めるように スタイルガイドに沿った可読性を意識した優れたPythonコードを書くようにしてください。

せっかくなので、このスタイルガイドを一つずつ例を挙げて読んでいくことにします。

インデント

Pythonのインデントは、 スペース4つです。

また、カッコの中身が長いときの改行の位置にも気をつけましょう。

In [1]:
# 関数定義の引数が長くなる時は改行してインデントを深くする
def my_first_func(
        long_argument_name_1, long_argument_name_2):
    pass

long_argument_name_1 = 1
long_argument_name_2 = 2

# 関数の引数を改行する時は、最初の文字をカッコの位置に揃える
my_first_func(long_argument_name_1,
                          long_argument_name_2)
In [2]:
# リストの中身を改行するときには、以下のようにする
my_list = [
    "a", "b", "c",
    "d", "e", "f", # 最後に , をつけても良い
]
In [3]:
v = 1.0 # [m/s]
m = 1.0 # [kg]
g = 9.8 # [m/s^2]
h = 10 # [m]
some_energy = 1.0 # [J]

# 長い数式はカッコに包んで、演算子を行の最初に持ってくる
energy = (m * v**2 / 2
                  + m * g * h
                  + some_energy)

インポート

ファイルの先頭にずらっと並びがちなライブラリのインポートの文も見やすくしましょう。

In [4]:
# [Good] ライブラリごとにインポート文は分ける
import os
import sys

# [Bad] まとめてインポートする
import os, sys

# [Good] ライブラリ内のインポートはまとめて良い
from pandas import DataFrame, Series

# [Bad] ワイルドカードを用いたインポートは避ける
from numpy import *

空白文字を入れるか入れないか問題

空白文字(スペース)を入れる場所によって、可読性が大きく変わってきます。

必ず統一するようにしましょう。

In [5]:
my_list = [1, 2, 3]

# [Good] , や : の後に空白文字を入れる
my_first_func(my_list[1], {"args": 2})

# [Bad]  カッコの直後に空白文字
my_first_func( my_list[ 1 ] , { "args" : 2} )

リストのスライスの指定も空白文字を入れる位置に気をつけましょう。

In [6]:
start, end = 0, 2
s1, s2 , e1, e2 = 0, 1, 1, 1

# [Good] 空白文字を入れない
my_list[start:end]

# [Good] 演算部分には空白文字を入れない( : の周りだけ入れる)
my_list[s1+s2 : e1+e2]

# [Good] 演算部分にも空白文字を入れる
my_list[s1 + s2 : e1 + e2]

# [Bad] 片方に偏ってる
my_list[start: end]
Out[6]:
[1, 2]

コメント

PEP: 8 Python コードのスタイルガイドによると、

英語を話さない国出身の Python プログラマの方々へ:あなたのコードが、自分の言葉を話さない人に 120% 読まれないと確信していなければ、コメントを英語で書くようにお願いします。

とあります。

科学技術計算でPythonコードを書く場合、必ず 英語 でコメントを書くようにしましょう。

pycodestyle

このようなスタイルを自動的にチェックしてくれるライブラリが作られています。

pycodestyle

慣れてくると、わざわざ調べなくても通るコードが書けてきますが、最初のうちはなるべくチェックして感覚を身につけましょう。

インストール

$ pip install pycodestyle

使い方

$ pycodestyle --show-source --show-pep8 <file-name>

flake8

さらに高度なラッパーライブラリが flake8 です。

flake8

インストール

$ pip install flake8

ヘルプ

$ flake8 --help

使い方

$ flake8 your-file.py

フォルダに対しても実行できます。

$ flake8 folder/

実装の複雑度も測ってくれます。複雑な関数は直しましょう。

$ flake8 your-file.py --max-complexity 10

エディタでコードスタイルチェックする

AtomやVS CodeといったエディタにPEP8のスタイルチェックをしてくれる拡張機能を追加しておくと大変便利です。

PyCharm, Spyderといったエディタにはデフォルトでチェックする機能がついているので、ぜひ有効にして見てください。

基礎編

応用編