【Eclipse×Python】PEP8に準拠したソースコードに自動整形する方法

3んにちは!たっきん(Twitter)です!

今日はEclipseの開発支援機能である「コード解析」「フォーマッター」の紹介をしていきたいと思います。

この機能を使うと事前に決められた規則に従い、ほぼ一瞬でコードを整形してくれます。

個人、チームでの開発を問わず、プログラミングをする上でコードスタイルを気にかける必要がほぼなくなるため、爆速でキレイなコーディングを目指している方には必須の機能になります。

なのでこれを機に「コード解析」「フォーマッター」をマスターしていきましょう!

Sponsored Link

なんでコードの整形が必要なの?

個人やチームでの開発を問わず、コードの解読やレビューなどで他人の書いたソースコードを読む機会は多いと思います。

そんなとき、以下のような<コードスタイル①><コードスタイル②>で書かれたコードを読むとなった場合、どちらのコードが読みやすいですか?

<コードスタイル①>

# ==============================================================================
# brief        閏年判定
#
# author       たっきん
# ==============================================================================


def judge_leap_yaer():

    while True:

        try:

            # 西暦の入力
            print("西暦を入力してください = ")

            year = int(input())

            if year % 4 == 0:
                if year % 100 == 0:
                    if year % 400 == 0:
                        print(" {0}年は閏年です。" .format(year))
                    else:
                        print(" {0}年は閏年ではありません。" .format(year))
                else:
                    print(" {0}年は閏年です。" .format(year))
            else:
                print(" {0}年は閏年ではありません。".format(year))

        except ValueError:
            print("Error:数字以外が入力されました。")


if __name__ == '__main__':
    judge_leap_yaer()


<コードスタイル②>

# ==============================================================================
# brief        閏年判定
#
# author       たっきん
# ==============================================================================


def judge_leap_yaer():

    while            True:

        try:

            # 西暦の入力
            print("西暦を入力してください = ")
            year = int(         input())
            if      year % 4        ==        0:
                if  year       % 100 == 0:
                    if                   year % 400 == 0:
                        print        (" {0}年は閏年です。"      .format(year))
                    else:
                        print     (          " {0}年は閏年ではありません。" .format(year))
                else:
                    print        (" {0}年は閏年です。"                .format(year))
            else:
                print        (           " {0}年は閏年ではありません。"                .format(year))

        except        ValueError:
            print             ("Error:数字以外が入力されました。")


if __name__ == '__main__':
    judge_leap_yaer(                 )

コードスタイル①のほうが統一感があって読みやすいです。
逆にコードスタイル②は統一感がないので読んでて疲れそうです。
規則正しくコードを書いたほうが、他人に読んでもらう場合も、後々自分で読み返す場合もストレスなく短時間でコードを理解することができるメリットがあります。

そして、「コードは書くよりも読まれることの方が多い」という考えのもとに生まれたのがPythonコードスタイルガイド「PEP8」になります。

PEP8の目的はPythonで書かれた幅広いコードのスタイルを一貫させることです。

参考Style Guide for Python Code

参考日本語訳

自動チェック & 整形機能で楽しよう!

いくらコーディングスタイルを守らねば!!と思っていても人はミスが付きもの。

いちいちコーディングスタイルを気にしながらコードを書いていたら、それだけでストレスが溜まってしまいますよね。

統合開発環境のEclipseには、そのような問題を解決する機能として自動チェック機能の「コード解析」と自動整形機能の「フォーマッター」というものが備わっています。

自動チェック機能:コード解析

コード解析はソースコードが決められた規則に従って記述されているか否かを自動で判別してくれる機能になります。

PEP8規約の適用有り/無しもオプションで設定できます。

この機能を有効にするとPEP8に準拠していない箇所をエディター上に通知してくれるようになります。

<コード解析実施結果例>

自動整形機能:フォーマッター

コード解析ではPEP8に準拠していない箇所の通知してはくれますが、指摘箇所の数が多い場合は1つ1つ手作業で修正していると面倒ですよね。

そんなときにフォーマッターが役に立ちます。

フォーマッターは実行するだけで、決められた規則に準拠するようにコードを自動で修正してくれます。

こちらもオプションでPEP8規約の適用有り/無しを設定できます。

<フォーマッター実施結果例>

BeforeAfter

Eclipseの設定手順

設定手順はEclipse 4.8 Photon (Python)のバージョンを使って説明していきます。

コード解析

Eclipseを起動し、「メニュー」⇒「ウィンドウ」⇒「設定」を選択する。

設定ウィンドウが開いたら、以下の手順を踏む。

  1. 左のペインから「PyDev」⇒「エディター」⇒「コード解析」を選択。
  2. 右のペインのタブ「pycodestyle.py(pep8)」を開く。
  3. 「エラー」、「警告」、「情報」のいづれかを選択する。(今回は「警告」を選択)
  4. 「適用」ボタンを押下する。

以上の設定が終わると、エディター上でPEP8に準拠していない箇所で行番号の左側に「三角形マークの"!"」が表示されるようになる。

※1つ前の手順で「警告」を選択した場合のみ

フォーマッター

設定ウィンドウが開いたら、以下の手順を踏む。

  1. 左のペインから「PyDev」⇒「エディター」⇒「コード・スタイル」⇒「コード・フォーマッター」を選択。
  2. 右のペインで「Use autopep8.py for code formatting?」のチェックボックスにチェックを入れる。
  3. 「適用」ボタンを押下する。

次に、エディター上で整形したい箇所を選択します。

通常は全選択になると思いますので「Ctrl+A」を押しましょう。

「メニュー」⇒「ソース」⇒「コードのフォーマット」を選択する。

または、ショートカットキーの「Ctrl+Shift+F」を押す。

選択箇所が整形され、警告マークが消えます。

注意すること

何かと便利なフォーマッターですが、コード解析で検出された箇所全てをフォーマッターが修正してくれるわけではありません。

例えば例外処理。

以下のコード7行目を見てください。

        try:

            # 西暦の入力
            print("西暦を入力してください = ")
            year = int(input())

        except:   # PEP8違反箇所!中身のない例外処理を利用してはいけない。
            print("Error:数字以外が入力されました。")

7行目で中身のない例外処理を書いていますが、これはPEP8の規約に違反します。

しかし中身は人が決めないといけないため、このような箇所はフォーマッターでは修正できません。

このような場合は人の手で修正することになります。

        try:

            # 西暦の入力
            print("西暦を入力してください = ")
            year = int(input())

        except ValueError:  # 例外処理の中身を定義。
            print("Error:数字以外が入力されました。")
Sponsored Link

このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。