この記事では、Pythonの設計思想を紹介します。
設計思想はコーディングスタイルに表れます。ライブラリは全てその設計思想に従っているのですから、ライブラリを使用してコーディングするアプリケーションのコードもその影響を受けます。そしてPythonの設計思想には従うべきです。
Pythonの文法は、その設計思想をよりよく反映するために設計されているのですから。
Pythonの禅
Pythonの設計思想は、「Pythonの禅」と呼ばれるアフォリズムめいた字句によって表されます。
「禅」ですから、そこから何を汲み取ろうが自由です。ただ本質というものはあります。Pythonでのプログラミングが上達するにつれて、「ああ、この禅はこういう意味だったのか」とより本質に迫れるようになります。
以下では、Pythonの禅の一部を取り上げて、それに筆者なりの解釈を書き加えていきます。
醜悪より美しい方が良い
Beautiful is better than ugly.
「美しいコード」と聞いて、何を連想するでしょうか?
rows = [1,2,3,4,5,6,7,8,9,10] for row in rows: print(str(row) + 'F')
row_max = 10 for row in range(1, row_max + 1): print(str(row) + 'F')
どちらのコードの方が「美しい」でしょうか?
大方の人が後者と答えると思います。美しい醜いは主観的な判断ですが、前者のコードの場合、マジックナンバーになっている、数を一つでも書き間違えると違う動作をする、などの点から言って、メンテナンス性に耐える美しいコードではありません。それよりも、row_maxを定義して、1からrow_maxまでとする方がメンテナンス性の上で大事です。
コードは速く書くだけがいいことではありません。美しいコードを書けば、他の人が見ても分かりやすく、メンテナンスしやすくなります。
暗黙より明示する方が良い
Explict is better than implict.
Pythonでライブラリからクラスや関数をimportするとき、例えば次のような書き方をします。
from selenium.webdriver.support.ui import WebDriverWait
これを見て、「長い!」と思うかもしれません。ただ、この一文があることによって、コード中にWebDriverWaitという単語が出てきたときに、どこからimportしているか誰でも分かるのです。そう、Seleniumに関する知識が無くても!
これがPythonの明示の例です。
Pythonは「読みやすさ」を至上命題とします。読みやすいとは、理解可能、という意味です。初めてそのコードを読む人でも理解可能なように、同一ファイル内にそのファイルで使うクラスや関数はすべて明示的に書くことになっています。他の言語では別ファイルで宣言する言語もありますが、エキスパートでないとなかなか読み解けませんよね。誰でも理解できる、これがPythonの特徴です。
組み合わせるよりはシンプルな方が良い
Simple is better than complex.
Pythonでの開発を進めていくと、言語仕様がシンプルなことに驚くと思います。
例えば、ファイルのオープンは以下です。
open(‘sample.txt’)
これだけです。実にシンプルです。他の言語では、このストリームにファイルを反映させて、それをまた別なストリームに反映させて…などといった言語もありますが、Pythonはその「組み合わせること」を拒絶します。シンプルに使い、もっと下部で対応しよう、というわけです。
だから、あなたがクラスライブラリをコーディングするときも、できるだけシンプルなクラスにしてください。1クラスに機能はいくつあってもいいですが、インタフェースは1つにしてください。使う側がシンプルに使えるように。余計なことを考えさせる必要がないように。
複雑よりは組み合わせる方が良い
Complex is better than complicated.
どうしても複雑になりそうなときは、組み合わせることを選択しましょう。全く別の意味を持つパラメータを二つ渡す必要があり、かつそのパラメータ同士の関連にも気を付けなければならないなら、パラメータはどんな値でも受け取り、パラメータの関連は関数内部で考えましょう。エラーを返せばいいだけです。複雑ではなく、組み合わせを選択するのです。
ネストしたものよりフラットな方が良い
Flat is better than nested.
これはそのままですね。インデントはなるべく深くならないようにしましょう。あまりにも長いインデントを書かないようにしましょう。可読性を損ないます。インデントが深くなる時は、関数に分けることを検討しましょう。
読みやすい分量にする
Readability counts.
一つの関数のコードはあまり長くならないようにしましょう。とはいえ、時に長いコードを書かなくてはならないかもしれません。そんなときは分割を検討しましょう。大抵の場合、複数の処理をさせようとするから長くなるのです。処理は一つの方が可読性が増します。
曖昧なものに出くわしたら、推測してはいけない
In the face of anbiguity,refuse the tempration to guess.
言うまでもないことですが、コードの振る舞いは全て把握しましょう。何をやっているのか理解していないクラスや関数は理解してから使いましょう。Pythonのライブラリのコードは全てあなたの開発マシンの中にあります。読むことは難しくありません。なんのために手元に全てのコードがあるのか、その意味を考えてください。そこにPythonの思想が表れています。
それを行うには明白な方法が1つ(できれば1つだけ)あるはず
There should be one – and preferably only one – obvious way to do it.
Pythonは、同じことをするのに、複数のやり方を通常許容しません。Pythonで書いたコードは、これをやるときにはこういう書き方になる、という事項がとても多いです。それが、チーム開発のやりやすさにつながっています。クセが出にくい(全く出ないとは言いません)言語なのです。
例えばDjangoでのユーザー管理について、これはもうUserクラスを使うとほぼ決まっています。Userクラスを使えば、プログラマの相違によるユーザー管理の相違は出ません。
あなたが書こうとしているコードは、本当に特殊な部分を除き、誰かが書いたコードです。その基盤部分はライブラリで提供されています。ですので、ライブラリを使い、同じコードで同じことをさせましょう。
まとめ
この記事ではPythonの設計思想を紹介しました。
書いたことはあくまでも筆者の解釈です。あなたには別の光景が見えるかもしれません。これは「禅」です。Pythonプログラマとして経験を詰んだ後、またこの「禅」について考えてみてください。一歩も二歩も成長した己自身が見られると思います。