Pythonのコーディング規約として公開されているPEP 8に今更ながら目を通すと理解が深まりました。
(需要はないと思いますが) 私視点で勉強になったことをまとめます。
式や文中の空白文字
スライス
スライスではコロンは二項演算子のように振る舞います。よって、(コロンは優先度が最も低い演算子として扱われるので)両側に同じ数(訳注: 無しでも可だと思われる)のスペースを置くべきです。拡張スライスでは、両側に同じ数のスペースを置かなければなりません。例外: スライスのパラメータが省略された場合は、スペースも省略されます。
# 正しい:
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]
# 間違い:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : step]
ham[ : upper]
私はスライスの左にスペースなし、右にスペースを入れるということをしていたような気もするので反省ポイント。
優先順位の違う演算子
優先順位が違う演算子を扱う場合、優先順位が一番低い演算子の両側にスペースを入れることを考えてみましょう。入れるかどうかはあなたの判断にお任せしますが、二つ以上のスペースを絶対に使わないでください。そして、2項演算子の両側には、常に同じ数の空白文字を入れてください。
# 正しい:
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
# 間違い:
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
これはよくやってしまいます。大反省。
末尾にカンマを付けるべき場合
要素が一つのタプルを作るとき
末尾にカンマを付けるかどうかは、通常は任意です。但し、要素数がひとつのタプルを作るときは例外的に必須です。混乱を防ぐため、要素数がひとつのタプルを作るときは、(技術的には冗長ですが) 括弧で囲むことを推奨します。
# 正しい:
FILES = ('setup.cfg',)
# 間違い:
FILES = 'setup.cfg',
ここまではちゃんとできていたのでセーフ。
繰り返し展開されることが期待される場合や、バージョン管理システムを使っている場合
末尾のカンマは冗長ですが、便利な場合もあります。たとえば値や引数、もしくはimportされた値のリストが繰り返し展開されることが期待される場合や、バージョン管理システムを使っている場合です。それぞれの値(など)を一行にひとつずつ置き、末尾にカンマをひとつ追加し、その次の行を 閉じ括弧/角括弧/中括弧 で閉じるというのがひとつのパターンです。しかし、区切りの終わりを示す目的で、同じ行の末尾にカンマを付けることは意味がありません(但し、既に示した、要素数がひとつのタプルの場合は除きます)
# 正しい:
FILES = [
'setup.cfg',
'tox.ini',
]
initialize(FILES,
error=True,
)
# 間違い:
FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)
引数やリスト等の末尾にカンマを付けるのはよく見ますし、私自身もやっていましたが理由は把握できていませんでした。
バージョン管理ツールについての言及はなるほどな~と思いました。
docstrings
TODO: PEP 257を読む!
まとめ
今回挙げていないことも含めPEP 8はPythonを使っている人であればまず目を通すべきものであるなと感じました。(コーディング規約だしそれはそうなのですが…)
時間を作ってdocstrings (PEP 257) の方も読んでみようと思います。