PythonにはPythonらしいコードの書き方というものがあるようです。これまでもPythonのコードを書いている中で、他のプログラミング言語との違いを感じている人もいると思いますが、Pythonのコードを書く上での超基本的な約束事は最初の頃にやりました。
ここでは、もうちょっと進んでPythonらしいと言われている書き方というか、こういう書き方をすればコードが理解しやすいという書き方に触れていこうと思います。また、Python自体でもコードの書き方のスタイルルールというものが指針として設けられています。これについてのチェックツールの導入についても合わせて触れておこうと思います。
ただ、私がしっかりとしたコードが書けているかというとそれは別の話になってしまうのですが、そのあたりはご容赦ください。
Pythonのコードはどのように書く?
これはPythonに限らないのかもしれませんが、プログラミングのコードは他の人が見たときに何が書いてあるのかがわかりやすいというのが大切です。
例えば、関数を定義するときにどんな処理を意味しているのか誰が見てもわかるように、関数にdocstringでドキュメントを付けるというようなことも見てきました。
Pythonの組み込み関数などをhelp()関数を使ってオンラインヘルプのドキュメントを見るることができますよね。
このようなPythonコードの書き方をPython自体がガイドラインとして作っています。
Pythonのコードスタイル規約:PEP 8
Pythonコードのコーディング規約として「PEP 8」というものがあります。
これは、ソースコードは「自分が書いている時間」よりも「人に読まれている時間」の方が長いので、「スタイルを統一して読みやすいコードを書こう」という考えで作られたコーディング上のガイドラインです。
上のPEP8のリンク先は英文ですけどPEP8を日本語に訳されたものはこちらにあります。
インデントが半角スペース4つといったお馴染みのことなど細かく書かれています。「ああ、そう言う風にするのか」と読んでいて新たな発見があったりします。
もちろんこの通りに書かなくてもプログラミングは動きますが、読みやすいコードであることは他の人がコードをメンテナンスする時だけでなく、自分が読み返す場合でも役立つはずです。
一度、目を通しておくのがいいでしょう。
読んでわかるコードを書く
PEP 8の規約に基づいてコードを書くのは読みやすいコードであることのガイドラインになるのは確かですが、もっとも読みやすいコードとは、ドキュメントが全く書かれていなくても、あるいはドキュメントを細かくチェックしなくても、Pythonのコードを上から読んでいくだけでどんな処理が書いてあるのかがわかるコードでしょう。
細かいドキュメントを書かなくても、Pythonのコード自体がドキュメントの内容としてわかる、Pythonのコードを読むだけで他の人が理解できる、そんなコード作成が大切だと言う人もいます。
コードはコンピューターが実行する為に読むものですが、同様に人が読むものでもあります。Pythonのコードも他の人が文章を読むように理解できるような書き方をすることが大切です。
日本でのプログラミングは、多くの時間を膨大な設計書、マニュアル、ドキュメントの作成に費やすことが多いそうです。一方、海外では設計書やドキュメントの作成に時間をあまりかけずに数ページ程度の簡単な設計書を用意するだけで素早く開発することがよくあるそうです。それは、コード自体が読みやすく意味がわかるように書かれているので、ドキュメントなどの資料がなくても開発している内容がわかるのだそうです。
例えば、新商品のリストを変数に入れておくのに、「list_1」みたいなものにして、コメントで説明するよりも、「new_item_list」みたいな感じにする方が意味がわかりますよね。計算を実行する関数を定義するときに単に「calc」と簡単に書いてドキュメントで解説するよりも、「tax_calculation」と書く方が一発で読んでわかりますよね。
海外のコードを見ると、関数名や変数名などが文章のように読めるようなものがあります。長いコードに見えたりしますが、何について書かれたものなのか確かにわかりやすいです。
Pythonのインデントの強制も、綺麗で読みやすいコードを書かせるためもあるので、しっかりと意識して書いてみましょう。
といっても、なかなか難しいかもしれませんね。私もまだまだです。
コードのチェックツールの導入
Pythonには規約に沿ってコードをチェックしてくれるパッケージがあります。このチェックツールをインストールして、自分のコードをチェックしましょう。
次の3つのツールをインストールします。
- pycodestyle
- flake8(フレークエイトと読むようです)
- pyLint(ピーワイリントと読むようです)
チェックツールのパッケージをインストール
ここでは、Anacondaを使っているので、condaコマンドでインストールします。
ターミナルを使って、conda install パッケージ名でインストールしましょう。
$ conda install pycodestyle
$ conda install flake8
$ conda install pyLint
ただ、Anacondaをインストールした時に、いくつかすでにインストールされているかもしれません。Anaconda-Navigatorを起動して、そちらから確認してインストールしてもOKです。
また、pipを使ってインストールももちろんできます。
$ pip install pycodestyle
$ pip install flake8
$ pip install pyLint
あと、pycodestyleですが、これまではpep8という名前でした。コードスタイル規約のPEP 8と混同するのを避ける為に名前が変更されたようです。pep8も使えますが、今度はバージョンアップがこちらでは成されないようなので、pycodestyleを使う方がいいでしょう。
おかしなコードでチェックツールを試す
それでは、ちょとおかしなコードを用意して、上記のツールでチェックしてみましょう。
ちなみに、チェックの厳しさはpycodestyle < flake8 < pyLint と順に厳密になるようです。
次のようなコードを用意してみました。
x =100
import csv
y = ["a", "b", "c"]
for i in y:
print(i)
このコード、意図的におかしな書き方のコードにしています。どこがおかしいか、わかりますかね?
コードを実行してみましょう。(ファイル名code_style.pyでAtomで実行しています)
無事に出力されていていますし、エラーは出ていません。コードが動くというだけなら問題ないのですが、コードの書き方はおかしいのです。
この程度のコードなら変な書き方をしても読めますが、大量のコードになると読みにくくなります。そのあたりを確認するものとしてチェックツールで見ていきましょう。
pycodestyleでコードチェック
コードのチェックツールは、ターミナルからコードを実行するのと同じように「pycodestyle ファイル名」とコマンドを打って利用します。
実行するとこうなります。
なにやら指摘が4つ表示されているのがわかりますね。
コードの1行目は変数xとイコールの間にスペースが複数(ここでは2つ)ある。さらに、イコールと値100の間にスペースが無い。3行目は、一番上でモジュールをインポートしていない。8行目のインデントが2つになっていて4つのスペースになっていない。
このようにコードのスタイルでおかしな点を指摘しています。
flake8でコードチェック
同様にターミナルからflake8でチェックしてみます。
こちらは、先ほどのpycodestyleよりも指摘が増えています。
先ほどと同じ指摘に合わせて、3行目のモジュールのインポートについて、「モジュールが使われていない」と指摘しています。
pyLintでコードチェック
同じようにpyLintでチェックするとこうなります。
pyLintは上二つのチェックよりも厳密ですね。
これまでの指摘との違いは、5行目のリストの中にもスペースが余分に入っている点、ドキュメントが無い点、定数として判定されて大文字で無い点(ここは本来はもっと別の書き方をすべきでしょう)などがさらに指摘されて、コードの評価のレイティングが判定されています。
コードを修正する
これらの指摘を受けたところを、次のようにコードを変更してみました。
""" 修正したコードです """ # ドキュメントを入れる。使わないモジュールは削除
X = 100 # スペースを揃える。ここでは定数と解釈して大文字に
Y = ["a", "b", "c"] # いらないスペースを削除
for i in Y:
print(i) # インデントを4つのスペースにする
この修正したコードで、pyLintでチェックしてみましょう。
コードの修正の指摘はなくなりました。レイティングも10になっています。
pyLintの指摘はかなり厳しいので、ここまで修正する必要無い場合もあります。簡単なメソッド定義など説明不要のようなものってあったりしますよね。そういうものは説明があるとかえって見づらくなります。コーディング作業上、修正の指摘をそのままにして置いて構わないという場面もあったりすると思います。
スタイルの規約に厳密に書くと逆に煩雑になることもありますから、どこまでを修正の基準にするかは各自や作業している仲間の中で決めるべきでしょう。まあ、どうあれ、pycodestyle くらいはチェックしてもいいのでは無いでしょうかね。
まとめ
Pythonのコーディングは他の人が読んでもわかるように書くというスタイルが推奨されています。PEP8でコーディングの規約が定められています。
ドキュメントを読まなくても、コードを上から下に読んでいくだけで内容がわかるようなコードを心がけるようにしましょう。単に見やすいだけでなく、具体的に意味のわかる変数名や関数名をつけるのも大切です。
コーディングのスタイルをチェックするパッケージとして、pycodestyle、flake8、pyLintがあり、順に厳密さが高くなります。
どこまで規約に沿った書き方をするのかを決めておくのも大切です。