IT業務効率化

Pythonのコードを綺麗に書けるようになるために大切な3つのこと

pythonをきれいに書くには

使っているIDEにコード検査ツールを入れる

IDE(統合開発環境)とはわかりやすくいうとエディタで、コードを書く環境のことです。

コード検査ツールとは、あなたの書いたコードが正しいか確認してくれる機能のことです。エラーが起きるコードを検知すると、赤線で警告が上がります。

python pep8実行できないエラーを警告してくれている

上の画像は一例です。7行目の最後に)が足りていないため、実行時にエラーになることを警告してくれています。

このコード検査ツールにコード規約の検査機能を追加します。

私はpep8という規約を守って書くようにしています。コード規約とは綺麗に書くためのルールを定めたものです。

1レベルインデントするごとに、スペースを4つ使う

すべての行の長さを、最大79文字までに制限しましょう

クラスの名前には通常 CapWords 方式を使う

などが一例です。このようなルールが覚えきれないほどあります。これらのルールを一個一個覚えていくわけには行きません。なので、自分が書いているコードが汚い時、自動で波線を引くように、IDEをカスタマイズしましょう。

下の画像は実行するには問題ないのですが、pep8の規約を守っていないコードです。

pep8 visualStudioCode

私はVisual Studio Codeを使っています。この設定を入れておくことで、コード規約を守っていない時に気づくことができます。

autopep8を使えば、自動でコードを整形してくれまずが、まずは自分で手直ししながら覚えることをお勧めします。

最後におまけとして、Visula Studioにこれの設定方法を記載しておきます。

良いと言われているコードを写経する

どの言語にも言えることですが、結局は写経することで成長します。

人のソースを見ることで、初めての書き方、新しい気づきがたくさんあります。先輩のコードでもいいですし、書籍を買ったのであれば、一から最後まで書いてみると早く成長できます。意外と有名な書籍の中でも、間違った書き方をしていたりします。他言語出身の著者がPythonではあまりしないような書き方をしている本もあります。(getter・setterを書いてしまったり)それでも、あらゆる人の真似をして、どんどん写経していくことが大切です。

しかし、闇雲に誰かの真似をしていても非効率ですし、Pythonのコードの中でお手本になると教えられたライブラリを2つ紹介します。

※あくまで私が関わる上司、同僚の中で言われている話なので、個人的見解が強めです。ご了承ください。

本当の初心者の中の初心者はちょっと速いかもしれません・・・

ですがこの2つのライブラリはとても綺麗な書き方をしているため、必ず見ておくようにと前職の上司から言われました。

特にnumpyの方ですが、docstring記法が有名です。docstringとは関数の役割を説明するためのドキュメントです。numpyの記法googleの提唱する記法と並んでよく知られており、開発者同士で同じ書き方をすることで、読みやすく管理しやすいソースにできます。

下のdocstringは、numpyのdocstringの一例です。

array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

Create an array.

Parameters
----------
object : array_like
    An array, any object exposing the array interface, an object whose
    __array__ method returns an array, or any (nested) sequence.
dtype : data-type, optional
    The desired data-type for the array.  If not given, then the type will
    be determined as the minimum type required to hold the objects in the
    sequence.  This argument can only be used to 'upcast' the array.  For
    downcasting, use the .astype(t) method.
copy : bool, optional
    If true (default), then the object is copied.  Otherwise, a copy will
    only be made if __array__ returns a copy, if obj is a nested sequence,
    or if a copy is needed to satisfy any of the other requirements
    (`dtype`, `order`, etc.).
order : {'K', 'A', 'C', 'F'}, optional
    Specify the memory layout of the array. If object is not an array, the
    newly created array will be in C order (row major) unless 'F' is
    specified, in which case it will be in Fortran order (column major).
    If object is an array the following holds.

    ===== ========= ===================================================
    order  no copy                     copy=True
    ===== ========= ===================================================
    'K'   unchanged F & C order preserved, otherwise most similar order
    'A'   unchanged F order if input is F and not C, otherwise C order
    'C'   C order   C order
    'F'   F order   F order
    ===== ========= ===================================================

    When ``copy=False`` and a copy is made for other reasons, the result is
    the same as if ``copy=True``, with some exceptions for `A`, see the
    Notes section. The default order is 'K'.
subok : bool, optional
    If True, then sub-classes will be passed-through, otherwise
    the returned array will be forced to be a base-class array (default).
ndmin : int, optional
    Specifies the minimum number of dimensions that the resulting
    array should have.  Ones will be pre-pended to the shape as
    needed to meet this requirement.

Returns
-------
out : ndarray
    An array object satisfying the specified requirements.

See Also
--------
empty, empty_like, zeros, zeros_like, ones, ones_like, full, full_like

Notes
-----
When order is 'A' and `object` is an array in neither 'C' nor 'F' order,
and a copy is forced by a change in dtype, then the order of the result is
not necessarily 'C' as expected. This is likely a bug.

必ずしもこれが絶対というわけではありません。しかし最初何もわからないときはコードと合わせて真似してみると、より早く成長すると思います。

オススメの本

美しく書くことはプログラマ全員が目指すところです。そのための書籍がたくさんあるので、勉強しましょう。

リーダブルコードはこの中で1つだけpythonの本ではありません。しかしプログラミングを始める人なら必須の本です。ただ、コードを書く前に読むのではなく、3ヶ月くらいコードを書いてみて、慣れた頃に読んでみてください。心にぐさぐさ刺さるものがあるはずです。

おまけ、Visual Studio Codeにpep8の検査機能を追加する

※mac向けの説明となります。

vs codeのインストール

https://code.visualstudio.com/

上記のページからインストールします。mac、windows、linux自分のOSに合わせてインストールします。

vs codeの拡張機能を入れる

vs codeを入れると、拡張機能を設定するwindowがあります。

そこでpythonと検索して、python拡張機能を取得します。

python vscode

pep8を設定する

コマンドラインでpip install pep8と入力し、pep8を取得します。

次にVS Codeの画面に戻って、Code>基本設定>設定>検索窓でpythonと検索して下さい。

vscode pep8

「setting.jsonで編集」をクリックします。

jsonが記述されているファイルが開けるので、lintingを有効、pep8を有効にしてください。

"python.linting.enabled": true,
"python.linting.pep8Enabled": true,

と記入します。

もし標準のpylintが有効であれば無効にしてください。記載がなければ特に何もする必要はないかと思います。

"python.linting.pylintEnabled": false,

もし上記の記載がtrueであればfalseに変えておいてください。

vscode pep8

これで設定は完了です。あとはpep8に準拠しない書き方は警告が上がるようになります。vscodeのコンソール画面を開いておくと、「問題」という多分の中に警告一覧がでます。クリックすると間違っている箇所にカーソルが移動します。

python pep8 vscode

これを利用して綺麗なコードを1つ1つ覚えていきます。ぜひ活用してください。

お読みいただきありがとうございます
ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki