done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

PEP8 のお話

小ネタ。PEP8のお話。

以下の様なコードを考えます。

def f(x, y = 1):
    pass


def g(z, w=1):
    pass


a = 1
b=1

これを、PythonのコードがPEP8と呼ばれるコーディング規則に則っているか調べてくれる ツールpep8を使って解析してみると、以下の様なエラーが出ます。

$ pep8 test.py
test.py:1:11: E251 unexpected spaces around keyword / parameter equals
test.py:1:13: E251 unexpected spaces around keyword / parameter equals
test.py:9:2: E225 missing whitespace around operator

つまり、最初の行のy = 1と、最後のb=1が怒られているみたいです。しかし、これは 一見矛盾しているようにも見えます。=の両端にスペースを入れるか入れないかが、 状況によって異なるみたいです。

PEP8の原文にあたっても、確かにこう書かれています。

Always surround these binary operators with a single space on either side: assignment (=), augmented assignment (+=, -= etc.), comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not), Booleans (and, or, not).

Don't use spaces around the = sign when used to indicate a keyword argument or a default parameter value.

何故このような書き方が推奨されているのか、調べてみました。やはり同じ疑問を持った 人がstackoverflowにいました。

Best Answerによると、

キーワード引数の=は変数への代入の際に使う=とは違うため

だそうです。

まあ確かに言われてみれば違いますよね。キーワード引数に変数が明示的に 与えられなかったときに初めて適用される値ですし。

後は単純に

長くなって冗長だから

という意見もありました。しかしこれだと全ての変数に対しても同じことが言えるのでは

ちなみにpep8のチェッカーはsudo pip install pep8で入れられます。