Pythonista コードスタイル PEP8

Python学習【365日チャレンジ!】122日目のマスターU(@Udemy11)です。

Pycharmでコードを書いてるとPythonista Udemy 記述ルールマークが表示されることがあります。

これは、

Pythonが定める【PEP8】という記述ルールに従っていませんよ〜

という注意なんです。

このドキュメントを隅から隅まで熟読すれば、Pythonの記述ルールの知識は完璧になりますが、そんな時間はありませんので、これまでに学習してきた復習を兼ねて、基本的な記述ルールをかいつまんで学習したいと思います。

昨日の復習

昨日は、何気なく使っていたPythonの用語について、きちんと理解するために復習しました。

defで定義しているメソッドと関数の違いやPythonファイルがモジュールと呼ばれていることなど、それぞれの用語について解説しました。

よく使う用語の復習はこちらをごらんください。

それでは、Pythonコードの記述ルールの基本について復習していきましょう。

importのルール

importは、他のPythonファイルやパッケージを読み込んで使うために最初に記述しますが、その記述方法にもルールがありました。

  • 標準ライブラリ→サードパーティー→パッケージ→モジュールの順で1行あける
  • アルファベット順
  • 基本はフルパスでモジュールを読み込む
import csv
import os

import termcolor

import jarvis.model.ranking

import session


それぞれのグループの間に1行入れて、それぞれのグループでアルファベット順に記述しています。

パッケージは、from jarvis.model import rankingと記述してもかいまいませんが、コードが長くなると、使っているrankingがどのパッケージのモジュールなのかわからなくなるので、フルパスで書くことが望ましいということでした。

また、fromを使って、直接関数を読み込むこともできますが、競合する可能性があるので、少なくともモジュール以上をimportする記述にするべきでした。

× from jarvis.model.ranking import recommend_sport

標準ライブラリを複数importするときは、,(カンマ)を使って並べて記述することができましたが、基本は一つずつimportしたほうがいいとのことです。

× import csv, os

importが終了したあとは、2行あけてから、コードを書き始めるルールになっています。

空白行のルール

空白行は、コードを見やすくするために必要不可欠です。
きちんと統一された【PEP8】ルールを守ってコードを書けば、他人が見てもわかりやすいコードになりますし、なんと言っても覚えやすいです。

【PEP8】で細かいところまで記述ルールが決められているからこそ、Pythonが見やすくわかりやすいプログラミング言語として人気が高い理由の一つと考えられます。

ということで、空白行を入れるルールをみてみましょう!

空白行のルール

  • トップレベルの要素ごとに2行あける
  • クラス内の要素は1行あける
  • importはグループごとに1行あける

トップレベル、つまりインデントされていない状態の関数やクラスの記述は2行あけて、クラス内の関数などの要素は1行あけます。

importについては、すでに解説しましたが、グループごとに1行あけ、最後はトップレベルなので、2行あけることになります。

import os #1行あける

import session #2行あける


os.path.exists('test.txt') #2行あける


class Robot(object): #1行あける

    def __init__(self, name):
        self.name = name #1行あける

    def add_num(self, a, b):
        return a + b #2行あける


r = Robot('Mike')
print(r.name)
print(r.add_num(3, 4))

このルールに従ってコードを書くべきなんですが、ついつい2行あけるべきところを1行にしたり、クラス内の空白行をなくしたりしてしまうんです。

空白行を入れるとどうしても長いコードになってしまうので、練習中と割り切って【PEP8】のルールを守らずにコードを書いてもいいかと思っていますが、実践的なコードを書くときはきちんとルールに従って空白行を入れたほうがいいでしょう。

インデントのルール

インデントはもう間違うことはないと思いますが、

半角スペース4つ

です。

def say_hello():
    print('hello') #インデントはタブキーではなく半角スペース4つ

タブキーでインデントを入れると、実行時にエラーが出てしまうので注意しましょう。

半角スペースのルール

半角スペースは、演算子の前後や引数を複数指定するときの,(カンマ)のあとに入れます。

注意するのは、デフォルト引数を入れるときの=(イコール)の前後にはスペースを入れませんが、演算子として使う=-などの前後にはスペースを入れます。

class Human(object):

    def __init__(self, name='Jarvis'): 
        self.name = name

    def sub_num(self, x, y):
        return x - y

わかりやすい変数名

変数名にはわかりやすい名前をつけます。

酒井さんの講座の中では、アルファベット一文字でatなどが変数として使われているところもありますが、あくまでレクチャーの解説として使っているだけなので、実際のコードでは変数を説明した名前をつけましょう。

× n = 'Mike'
○ name = 'Mike'

関数にしてもadd_num()のように、名前を見て何をするのかわかるような名前にすることが大切です。

無駄な記述は省く

class Jarvis(object):

    def jarvis_speak(self): #speakにしたほうが実行時、シンプルになる
        print('hello')


jarvis = Jarvis()
jarvis.jarvis_speak() #jarvis.speak()にすることができる

関数名を例にすると、Jarvisというクラスの中に、speakという話すための関数を作る時に、関数名をjarvis_speakとしたとしましょう。

jarvisインスタンスを生成し、関数を実行する時には、jarvis.jarvis_speak()となるため、jarvisが2つ続いてしまいます。

なので、簡潔なspeakという名前にしたほうがいいということです。

もう一つ、辞書型のデータからkeyを取り出す場合を考えてみます。

d = {'key1': 'test1', 'key2': 'test2'}
for i in d.keys(): #.keys()は省略することができる
    print(i)

この場合、2行目でd.keys()で辞書型からkeyを取り出しています。

しかし、単にdだけでもkeyを取り出すことができるので、keys()は省くことができます。

スネークケース

スネークケースというのは、_(アンダースコアー)を使って小文字のみの単語をつなげた変数名や関数名のことです。

スネークケースを使うのは、変数や関数、モジュールの名前で、モジュール名は基本小文字のみですが、_を使ったほうが見やすい場合は使っても問題はありません。

say_somethingadd_numget_templateなど。

キャメルケース

キャメルケースは、ラクダのコブから来ているもので、クラス名で使われ、単語の先頭文字を大文字にします。

CsvModelSportsRobotなど

基本クラス名にはアンダースコアは使われません。

定数(グローバル変数)

トップレベルに定義するグローバル変数は、基本的に値を変更しないので、定数と呼ばれますが、全て大文字で記載することで変更してはいけない定数という意味を持っています。

この共通理解によって、他のプログラマーが値を変更しないようにというメッセージになっているわけです。

DEFAULT_ROBOT_NAME = 'Jarvis'

あと、パッケージの名前については、全て小文字でアンダースコアも使用しない名前にします。

非公開変数・関数

こちらの記事で少しふれているのですが、変数や関数の前に_をつけることで、非公開の変数や関数にすることができます。

ソースの中でのみ使う変数や関数なので、基本的に_が先頭に付いていれば、自分のコードでない場合はアクセスしないようにしましょう。

if __name__ == ‘__main__’:

port jarvis.controller.conversation


def main():
    jarvis.controller.conversation.talk_about_sports()

if __name__ == '__main__':
    main()

実行ファイルは、関数を定義して、if __name__ == '__main__':を使って実行するようにします。

モジュールに実行コードが記述されている場合、importされた時点で、プログラムが動き出します。

なので、パッケージをインポートしたときには、上記の記述がなければ、__main__で実行されていない場合であってもプログラムが走り出してしまいます。

そんなエラーを防止するために、実行のための関数(例えばmain()を定義して、__name____main__のときのみ実行するように記述する必要があるということです。

健忘録的に

Pythonに限らず、何かを継続して学習していると、「それ前にやったよな」ということが出てきます。

そんな時のために、健忘録的に毎日記事を書いているわけですが、今回のエントリーは、今後、自分で何度も見返すような内容になっていると思います。

Pythonの基本的な記述ルールはとても大切ですし、【PEP8】に気をつけながらコードを書くことで知らずしらずのうちにコードの記述ルールが身についていくはずです。

4ヶ月ほど継続してPythonのコードを書いてきましたが、インデントや半角スペースの使い方は自然と身についているように感じています。

このPython学習365日チャレンジは、仮に忘れていたとしても、自分が見て理解できることを心がけて書いていますが、たまに見返すと、わかりにくいなと思うことがあるので、そんなときはしっかりと修正するようにしています。

しっかりとした記述ルールを身につけて、もっと実用的なコードが書けるように頑張りたいと思います。

それでは、明日もGood Python!