Pythonのコーディング規約PEP8を要約してみる(1)

  • 20
    いいね
  • 0
    コメント

はじめに

PEP8の日本語版は以下のURL
https://pep8-ja.readthedocs.io/ja/latest/#id4
に書かれているのだが,私は長い文章を読むことが苦手なので私なりに要約した.
1つのテーマにつき1〜2文を心掛けて要約したものの,それでもまだ長いので記事を複数回に分ける.
文字だけで説明するのは難しいと判断した内容に関してはサンプルコードも載せた.
要約しすぎて意味まで変わってしまっているということがあればコメントしてください.

コードレイアウト

インデント

1つのインデントごとに,スペースを4回入れる.

タブかスペースか?

スペースの方が望ましい.
Python3ではインデントにタブとスペースを混ぜるとエラーが出る.

1行の長さ

すべての行の長さを,最大79文字までに制限する.

2項演算子の前で改行すべきか、後で改行すべきか?

統一されているのであれば、2項演算子の前後どちらででも改行しても問題ない.
段落の中にある式は、常に2項演算子や関係演算子の後で改行するが,構造化された式は常に2項演算子の前で改行するのを推奨されている.

良い例:演算子とオペランドを一致させやすい
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
悪い例:演算子がオペランドと離れてしまっている
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

空行

関数やクラスの定義は2行ずつ空ける.
クラス内の関数の定義は1行ずつ空ける.

ソースファイルのエンコーディング

常にUTF-8を使用するべき.

import

import文は,通常は行を分けるべき.

良い例
import sys
import os
悪い例
import sys,os

しかし,以下のような場合はOK

from subprocess import Popen, PIPE

モジュールレベルの二重アンダースコア変数名

__all__,__author__,__version__

のようなモジュールレベルの “二重アンダースコア変数”はimport 文の前に書く

文字列に含まれる引用符

単一引用符' で囲まれた文字列と、二重引用符 " で囲まれた文字列は同じ.
統一されているのであればどちらを用いても問題なし.

式や文中の空白文字

以下の場合では空白は余計である

・括弧やブラケット、波括弧 のはじめの直後と、終わりの直前

良い例:
spam(ham[1], {eggs: 2})
悪い例:
spam( ham[ 1 ], { eggs: 2 } )

・カンマやセミコロン、コロンの直前

良い例:
if x == 4: print x, y; x, y = y, x
悪い例:
if x == 4 : print x , y ; x , y = y , x

・関数呼び出しの引数リストをはじめる開き括弧の直前

良い例:
spam(1)
悪い例:
spam (1)

・インデックスやスライスの開き括弧の直前

良い例:
dct['key'] = lst[index]
悪い例:
dct ['key'] = lst [index]

・代入演算子を揃えるために、演算子の周囲に1つ以上のスペースを入れる

良い例:
x = 1
y = 2
long_variable = 3
悪い例:
x             = 1
y             = 2
long_variable = 3

・その他の推奨事項

・行末に余計な空白文字を残さない
・2項演算子は、両側に常にひとつだけスペースを入れる
・キーワード引数や、デフォルトパラメータであることを示すために使う = の両側にスペースを入れない

良い例:
def complex(real, imag=0.0):
    return magic(r=real, i=imag)
悪い例:
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)

・関数アノテーションはコロンの前にスペースを入れないというルールを守りつつ,-> 演算子がある場合はその両側には常にスペースを入れる.

良い例:
def munge(input: AnyStr): ...
def munge() -> AnyStr: ...
悪い例:

def munge(input:AnyStr): ...
def munge()->PosInt: ...

・デフォルト値をもった引数アノテーションと組み合わせる場合、 = の前後にはスペースを入れる

良い例:
def munge(sep: AnyStr = None): ...
悪い例:
def munge(input: AnyStr=None): ...

・複合文(一行に複数の文を入れること)は一般的に非推奨.また,if/for/while と 短い文を同じ行に置くことがOKな場合もあるが、複合文を置くのはNG

良い例:
if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()
悪い例:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()