Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

お前誰よ aodag open collector pylonsproject.jp

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

設定ファイル ツール独自 .flake8 pytest.ini … setup.cfg tox.ini pyproject.toml

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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