Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Pycon Kyushu 2019] Pythonでの開発を効率的に進めるためのツール設定

[Pycon Kyushu 2019] Pythonでの開発を効率的に進めるためのツール設定

Atsushi Odagiri

May 18, 2019
Tweet

More Decks by Atsushi Odagiri

Other Decks in Technology

Transcript

  1. Python での開発を効率的に進めるためのツー
    ル設定
    Pycon Kyushu 2019
    Atushi Odagiri
    May 18, 2019

    View Slide

  2. Outline
    はじめに
    プログラミングエディター
    コード補完/クオリティチェック/フォーマッタ
    テスト/デバッグ/プロファイル
    タスクランナー
    プロジェクトテンプレート
    まとめ

    View Slide

  3. お前誰よ
    aodag
    open collector
    pylonsproject.jp

    View Slide

  4. Python 開発ツール
    クオリティチェック/コード補完/フォーマッタ
    テスト/デバッグ/プロファイル
    タスクランナー
    プログラミングエディター

    View Slide

  5. エディターに望む機能
    シンタックスハイライト
    賢い補完
    静的チェックの結果表示
    スニペットの展開
    プログラム可能な機能

    View Slide

  6. 優秀なプログラミングエディター
    emacs
    vim
    visual studio code
    pycharm

    View Slide

  7. コード補完
    jedi
    他に…知らない

    View Slide

  8. jedi
    コード補完のエンジン
    いろんなエディタの補完プラグインから呼べる
    名前についてはご愛敬

    View Slide

  9. コード補完をもっとうまくやる
    typing annotation
    特に引数につけないと関数内で補完効かない
    . の連鎖を減らす
    a.b.c.d など連鎖すると type annotation がない場合、補完で
    きる可能性が低くなります

    View Slide

  10. クオリティチェック
    flake8 おすすめ
    pylint
    mypy

    View Slide

  11. pylint
    pylint は厳しすぎ
    メソッド数の下限上限
    例えばコンストラクタだけのオーバーライドなど禁止
    その場しのぎの回避もまた別のチェックにひっかかる
    全体的な設計変更に…

    View Slide

  12. flake8
    pycodestyle + pyflakes
    フォーマッタ使うと pycodestyle 部分はそれほど..
    pyflakes
    やってしまいがちなケアレスミスのチェック
    宣言のない変数
    関数名の重複
    利用していない変数

    おすすめというかもはや必須

    View Slide

  13. mypy
    type annotation のチェック
    jedi での補完目的で type annotation するなら必ず mypy で
    チェックしましょう
    ignore_missing_imports は必須!
    type annotation を提供してないライブラリは多いので…
    docstring でがんばって型を説明するくらいなら annotation
    にしてほしいところ

    View Slide

  14. フォーマッタ
    autopep8
    yapf
    black おすすめ
    isort おすすめ

    View Slide

  15. black のいいところ
    ほとんど設定変更できない
    諦めがつく
    へんな亜流が出てこない

    View Slide

  16. black のよくわからないところ
    なぜか行の最大長が 88 文字

    View Slide

  17. その import、ソートできますか?
    isort は import 文の順番に特化したフォーマッタ
    標準ライブラリ、サードパーティライブラリ、開発中ソース
    ツリーの順になおしてくれる
    これでエラー出たり、挙動が変わるなら循環依存があるので
    なんとかしましょう

    View Slide

  18. black と isort を組み合わせる
    デフォルトだと black のフォーマットと違う
    isort のスタイル設定を black に合わせる
    Vertical Hanging Indent
    multi_line_output=3
    isort の行の長さを black に合わせる
    line_length=88

    View Slide

  19. isort (3: Vertical Hanging Indent)
    from third_party import (
    lib1,
    lib2,
    lib3,
    lib4,
    )

    View Slide

  20. black と flake8
    flake8 の独自解釈が black のフォーマットと衝突する
    演算子の改行位置 W503 line break before binary
    operator
    スライス演算子の前後スペース E203 whitespace before
    ':'
    しょうがないので ignore しましょう

    View Slide

  21. 演算子の改行位置 W503 line break before binary
    operator
    x = (aaaaaaaaaaaaaaaaa +
    bbbbbbbbbbbbbbbbbbb)
    y = (aaaaaaaaaaaaaaaaa
    + bbbbbbbbbbbbbbbbbbb)

    View Slide

  22. スライス演算子の前後スペース E203 whitespace
    before ':'
    black はスライス演算子前後で計算式が入るとスペースを入
    れる
    flake8 は : にスペースをいれてはいけないと言ってくる
    この場合の : は演算子ではなくブロック構文の区切りの :
    のことのはず
    a = x[start:stop]
    a = x[start:(start + count)]
    a = x[start : (start + count)]

    View Slide

  23. フォーマッターを導入していくには
    一気に導入
    フォーマットのみの PR が嫌でなければ
    blame したときに困るかも
    部分的に導入
    なんらかの修正時にフォーマッターをかけていく
    autopep8 などの設定である内容だけ適用していく
    フォーマットかけると本来の変更との diff が見づらい

    View Slide

  24. black, isort を CI で使う
    CI でフォーマットするのではない
    フォーマット済みであるか確認する
    check オプションや diff オプション

    View Slide

  25. テスト
    unittest
    nose
    pytest おすすめ
    zope.testrunner

    View Slide

  26. pytest
    テストフレームワーク
    テストランナー

    View Slide

  27. テストランナーとしての pytest
    名前でテストを探し出す discovery 機能
    test_* とか Test* とか
    unittest で書いたテストでも実行可能
    賢いテストレポート
    成功したテストの print を表示しない
    assert が落ちた時、付近の変数の内容を表示してくれる

    View Slide

  28. テストフレームワークとしての pytest
    fixture
    まあ好き嫌いはありますが
    最近は yield で setup/teadown 相当の処理をそのまま書けます
    yield_fixture は deprecated
    marker
    適当にテストを分類したり
    特殊な fixture を割り当てたり
    parametrize
    もうテストメソッドの中で for 文なんかいらないぞ!
    入出力の違いだけのテストならこれでいきましょう
    parametrize 自体に fixture できないのはちょっと不満

    View Slide

  29. pytest アドオン
    pytest-cov
    基本です。いれておきましょう。
    自分が狙ったテストを書けているか確認しましょう
    coverage に溺れないように!
    pytest-randomly
    インストールするだけでテスト順序がシャッフルされます
    順序に依存したテストを発見しましょう
    ユニットテストを一歩先のステージにもっていきましょう
    pytest-mock
    patch デコレータがいくつもある人に
    patch コンテキストな何段も積み重なってる人に
    SPY など追加のユーティリティもあるので mock をそのまま
    使うよりちょっと便利

    View Slide

  30. デバッグ
    使ってないのでわかりません (´・ω・`)

    View Slide

  31. プロファイル
    profiler
    gprof2dots
    profiler の結果を (プロットじゃない方の) グラフ表示にしてく
    れる

    View Slide

  32. pyinvoke
    tasks.py
    関数に @task デコレータつけるだけ
    from invoke import task
    @task
    def hello(ctx):
    print("Hello")

    View Slide

  33. nox
    テストに特化したタスクランナー
    tox を invoke にしたようなツール
    virtualenv と連携

    View Slide

  34. paste script
    メンテナ不在?
    そろそろ退役?
    プロジェクトテンプレートをパッケージングする

    View Slide

  35. cookiecutter
    github とかで公開リポジトリにするだけ
    pyramid などの有名プロジェクトも cookiecutter で提供する
    ようになりました
    paste script ほど複雑なことはできない
    もう複雑なことはやめましょう

    View Slide

  36. 設定ファイル
    ツール独自
    .flake8
    pytest.ini

    setup.cfg
    tox.ini
    pyproject.toml

    View Slide

  37. 最終公分母は setup.cfg か tox.ini
    しかたないね
    black だけ pyproject.toml
    まあ black は設定しないって割り切れば…
    テスト系は tox.ini、それ以外は setup.cfg とか分ける方法も

    View Slide

  38. tox.ini
    [tool:pytest]
    test_paths = tests
    [isort]
    line_length = 88
    multi_line_output = 3
    [flake8]
    max-line-length = 80
    ;W503 line break before binary operator
    ;E203 whitespace before ':'
    ignore = W503,E203

    View Slide

  39. こんなにツール入れなくても pycharmでできちゃうよ!
    って人は CI 上でも pycharm 実行してチェッカーにしてくだ
    さい

    View Slide

  40. まとめ
    クオリティチェックは機械にやらせましょう
    せめて flake8 は標準でいれていてほしいところ
    フォーマッタはレビュアーのためにいれてあげてください
    主義主張は black の前には無意味だ
    秘伝のコマンドラインはみんなで使えるようにしましょう
    自分のローカルマシンでしか動かない? 環境変数に追い
    出せ!
    エディタは
    自主規制により省略されました

    View Slide