CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: pep8 は pycodestyle になったし pep257 は pydocstyle になった

意外とまだあんまり知られていないような気がしたので、このブログにも書いておく。

PEP8 と pep8 と pycodestyle

Python には PEP8 という有名なコーディングスタイルガイドラインがある。

www.python.org

そして、そのコーディングスタイルに沿ったコードになっているのかをチェックするツールとして pep8 というパッケージがあった。

pypi.python.org

過去形にするのは半分正しくなくて、上記のように今もある。 ただ、これは後方互換のために残されているだけで、もうバージョンアップはされないだろう。

今後は代わりに pycodestyle というパッケージを使うことになる。

pypi.python.org

これは単にパッケージとコマンドの名前が変わっただけ。 とはいえ、こちらはバージョンアップが続くので最新の PEP8 に追従していくしチェックできる範囲も増えていくはず。 (PEP に書かれている内容は必要に応じて更新される)

試しに使ってみることにしよう。 まずは Python のパッケージマネージャである pip でインストールする。

$ pip install pycodestyle

サンプルコードとして PEP8 違反がいくつか含まれるものを用意した。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 改行が足りない
def greeting(name = 'World'):  # 余分なスペースがある
    print('Hello, {name}'.format(name=name))


def main():
  greeting()  # インデントが 4 スペースでない


if __name__ == '__main__':
    main()

# 改行が多い

pycodestyle コマンドで上記のコードをチェックしてみる。

$ pycodestyle sample.py
sample.py:5:1: E302 expected 2 blank lines, found 1
sample.py:5:18: E251 unexpected spaces around keyword / parameter equals
sample.py:5:20: E251 unexpected spaces around keyword / parameter equals
sample.py:10:3: E111 indentation is not a multiple of four
sample.py:17:1: W391 blank line at end of file

色々と PEP8 に準拠していない箇所が見つかった。

PEP257 と pep257 と pydocstyle

同じことが pep257pydocstyle にも起きている。

PEP257 は docstring のフォーマットを規定したドキュメントの名前を指している。

www.python.org

そして、PEP8 と同じように pep257 というチェックツールがあった。

pypi.python.org

そして、同じように pydocstyle という名前に変更されている。

pypi.python.org

こちらも試しに使ってみることにしよう。 pip でさくっと入る。

$ pip install pydocstyle

そして PEP257 に違反している箇所を含むサンプルコードを用意した。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# そもそも docstring がない


def greeting(name='World'):
    '''ダブルクォートを使っていない'''
    print('Hello, {name}'.format(name=name))


def main():
    """
        改行が多い
    """
    greeting()


if __name__ == '__main__':
    main()

pydocstyle コマンドで上記のコードをチェックしてみよう。

$ pydocstyle sample.py
sample.py:1 at module level:
        D100: Missing docstring in public module
sample.py:7 in public function `greeting`:
        D300: Use """triple double quotes""" (found '''-quotes)
sample.py:7 in public function `greeting`:
        D400: First line should end with a period (not '')
sample.py:12 in public function `main`:
        D200: One-line docstring should fit on one line with quotes (found 3)
sample.py:12 in public function `main`:
        D208: Docstring is over-indented
sample.py:12 in public function `main`:
        D400: First line should end with a period (not '')

PEP257 に違反している箇所が見つかった。

周辺ツールの対応

リネームされたパッケージを依存パッケージに持つ主要なパッケージはどうなっているかなー、というのも一応は確認しておく。 例えば flake8 とか autopep8 について pipdeptree で見てみよう。

$ pip install flake8 autopep8 pipdeptree

flake8pycodestyle を使うようになっている。

$ pipdeptree | grep -A 3 flake8
flake8==3.3.0
  - mccabe [required: <0.7.0,>=0.6.0, installed: 0.6.1]
  - pycodestyle [required: >=2.0.0,<2.4.0, installed: 2.3.1]
  - pyflakes [required: >=1.5.0,<1.6.0, installed: 1.5.0]

autopep8pycodestyle を使うようになっていた。

$ pipdeptree | grep -A 1 autopep8
autopep8==1.3.2
  - pycodestyle [required: >=2.3, installed: 2.3.1]

間接的に使っている場合には特に対応する必要はなさそうだ。

まとめ

  • pep8pycodestyle に名前が変わった
  • pep257pydocstyle に名前が変わった
  • flake8 とかで間接的に使っている分には特に対応する必要はない

参考

事の発端は、このチケットらしい。

Please rename this tool · Issue #466 · PyCQA/pycodestyle · GitHub

いじょう。