SlideShare a Scribd company logo
Python での開発を効率的に進めるためのツー
ル設定
pycon jp 2019 ビギナーセッション
Atsushi Odagiri
September 16, 2019
Outline
Python での開発を効率的に進めるためのツール設定
flake8
black
mypy
pytest
tox
エディタ設定
まとめ
おまえだれよ
aodag: Atsushi Odagiri
株式会社オープンコレクター
pylonsproject.jp
今日のお題
開発を効率的に進めるためのツールを知りましょう
効率的に進める
つまらないミスをしないようにしましょう
がんばるだけではいつかミスをします
機械は疲れない! ツールに頼ろう!
はじめの準備
いつでも venv で作業しましょう
$ python3.7 -m venv .venv
$ source .venv/bin/activate
> py -3.7 -m venv .venv
> .venvScriptsactivate.ps1
flake8 とは
静的チェックツール
バグにつながりやすいソースコードをチェック
静的なので実際動かしてどうこうではない
なぜ静的チェックツールを使うのか
つまらないミスをなくそう
レビューで指摘されるより手元のツールでわかったほうが気
分いいよね?
flake8 のインストール方法
$ pip install flake8
flake8 の設定ファイル
.flake8 か setup.cfg, tox.ini など
ツール独自のファイルだとトップディレクトリに散らかるの
で汎用的なのが好み
[flake8]
max-line-length = 88
ignore = E203,W503,W504
flake8 実行例
def add(a, b):
return a + b
def f():
return add(None, 0)
def add(a, b):
c = a if a else 0
return a + b
flake8 実行結果
flake8 .flake8_violated.py
.flake8_violated.py:9:1: F811 redefinition of unused 'add'
.flake8_violated.py:10:5: F841 local variable 'c' is assig
修正しましょう
def f():
return add(None, 0)
def add(a, b):
c = a if a else 0
return c + b
black とは
PEP8 準拠なコードフォーマッター
autopep8, yapf などの既存のフォーマッターとの違い
ほとんど設定できない
たとえ pep8 に準拠しているコードでも問答無用で black スタ
イルにフォーマットされる
もう設定で悩むのはやめよう (プロジェクトごとにちょっと
設定が違うとかもやめよう)
なぜフォーマッターを使うのか
フォーマットされたコードは読みやすい
なんか変なことしているコードを見つけやすい
black のインストール方法
$ pip install black
black の設定ファイル
一応 pyproject.toml が設定ファイル
行長と除外ファイルくらい設定できる
black の使い方
そのまま実行するとフォーマット実行
--check オプションでフォーマットされるファイルがあるか
チェック
--diff オプションでどのようにフォーマットされるか差分
表示
black 実行例
def add(a, b):
c = (
a
+
b)
return a + b
black 実行結果
black --diff .black_diff.py
--- black_diff.py 2019-09-16 01:11:41.391055 +0000
+++ black_diff.py 2019-09-16 01:11:47.066582 +0000
@@ -1,7 +1,4 @@
def add(a, b):
- c = (
- a
- +
- b)
+ c = a + b
return a + b
reformatted black_diff.py
All done! black --diff .black_diff.py
mypy とは
type hint チェック
実行時は関係ない
なぜ type hint チェッカーを使うのか
ドキュメントやコメントで書くより厳密
正しくない type hint はエディターの補完などで有害
実行しなくても型チェッカーで間違いがわかる
mypy のインストール
$ pip install mypy
mypy の設定ファイル
mypy.ini, setup.cfg
ignore_missing_imports は今のところ必須
type hint を提供していないライブラリを許す
[mypy]
ignore_missing_imports=1
mypy 実行例
from typing import Optional
def f():
return add(None, 0)
def add(a: Optional[int], b: int):
c = a if a else 0
return a + b
mypy 実行結果
mypy .mypy_violated.py
mypy_violated.py:9: error: Unsupported operand types for +
mypy_violated.py:9: note: Left operand is of type "Optional
修正しましょう
from typing import Optional
def f():
return add(None, 0)
def add(a: Optional[int], b: int):
c = a if a else 0
return c + b
pytest とは
テストランナー
ユニットテストフレームワーク
なぜ pytest か。unittest との違い。
詳細なテストレポート
アドオン
fixture の仕組み
関数 + assert 文 vs TestCase クラスの assert メソッド
pytest のインストール
$ pip install pytest
pytest アドオンの例
pytest-cov
coverage 情報収集
pytest-django
request や client などの fixture を提供
pytest-mock
mock を pytest 向けに使いやすくした fixture
pytest-freezegun
時間関連のモックツール freezegun の pytest fixture
pytest-randomly
random seed の設定
テスト順序をシャッフル
使い方 (1)
テスト対象
# loader.py
import json
FILENAME = "value.json"
def load():
with open(FILENAME) as f:
return json.load(f)
def save(v):
with open(FILENAME, "w") as f:
json.dump(v, f)
使い方 (1)
テストコード
# test_loader.py
import json
from loader import save, load
def test_save():
v = {"value": 1}
save(v)
with open("value.json") as f:
assert json.load(f) == {"value": 1}
def test_load():
result = load()
assert result == {"value": 1}
問題点
test_load は test_save 実行後じゃないと成功しない
test_save だけ単独実行できない
いつもテストを全部実行しないといけない?
対策
テスト実行順をシャッフルする
順序依存のテストを発見
全体実行
pytest-randomly なしだといつもうまくいってしまう
$ pytest .test_loader.py
テスト指定で実行
$ pytest .test_loader.py::test_load
$ rm value.json
$ pytest .test_loader.py::test_load
pytest-randomly を入れて実行
テスト順がシャッフルされるので複数回実行してみましょう
$ pip install pytest-randomly
$ pytest .test_loader.py
$ pytest .test_loader.py
$ pytest .test_loader.py
$ pytest .test_loader.py
tox とは
テスト用 virtualenv の管理
テストタスクの管理
tox を使う意味
様々なバージョンの python でテストする
CI 上でもローカルでも tox で同じテストを実行する
tox のインストール
$ pip install tox
tox.ini
[tox]
envlist = py36,py37
[testenv]
deps = pytest
commands = pytest
実行
-e オプションで実行したい env を指定する (指定しなければ
全部)
$ tox -e py37
ツールを実行するタイミング
CI で実行
pre-commit で実行
コマンドラインで手動実行
エディタ上で自動実行
エディタからツールを使えるようにしましょう
編集や保存と同時に警告、フォーマット
その場ですぐ直しましょう
自分で実行すると、たまに忘れて CI で落ちてがっかり
ツールとか連携できるエディタ
visual studio code
emacs
vim
pycharm
エディタで設定したいこと
編集中に flake8/mypy の警告を表示
保存したら black でフォーマット
テスト実行結果からエラー箇所にジャンプ
テストでカバーされた行をマーカーで表示
vs code
python.linting.flake8.enabled
python.linting.mypy.enabled
python.linting.pylint.enabled false
python.format.provider = ”black”
editor.formatOnSave
emacs
静的チェックのフレームワーク flycheck や flymake
flycheck はデフォルトで flake8 対応
save フック
save フックで black を適用
vim
使ってないのでわかりませんが、同じようなことができるで
しょう
pycharm
使ってないのでわかりませんが、同じようなことができるで
しょう
覚えて帰ってほしいこと
退屈なことは機械がやってくれる
レビュアーの時間を奪わないように
自分でやってみてほしいこと
自分のプロジェクトに導入できそうな pytest アドオンを調べ
てみましょう
pytest-django, pytest-mock…
プロジェクトの CI に導入してみましょう

More Related Content

What's hot (20)

PDF
金融×AIで解くべき問題は何か?
Tsunehiko Nagayama
 
PPTX
情報検索とゼロショット学習
kt.mako
 
PPTX
For MANABIYA
ssuserafaae8
 
PPTX
情報アクセス技術のためのテストコレクション作成
kt.mako
 
PDF
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
Yusuke Suzuki
 
PPT
ジェネリクスの基礎と クラス設計への応用
nagise
 
PDF
モデルアーキテクチャ観点からのDeep Neural Network高速化
Yusuke Uchida
 
PDF
保守運用コストの適正化事例 20120725
コシキ・バリューハブ株式会社/KOSHIKI ValueHub
 
PDF
ブラック企業から学ぶMVCモデル
Yuta Hiroto
 
PPTX
優れた研究論文の書き方―7つの提案
Masanori Kado
 
PDF
PyQtではじめるGUIプログラミング
Ransui Iso
 
PDF
Explanation in Machine Learning and Its Reliability
Satoshi Hara
 
PPTX
学習時に使ってはいないデータの混入「リーケージを避ける」
西岡 賢一郎
 
PDF
ドワンゴにおける新卒エンジニア向けScala研修について
Kota Mizushima
 
PDF
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Yoshitaka Kawashima
 
PPTX
【DL輪読会】Which Shortcut Cues Will DNNs Choose? A Study from the Parameter-Space...
Deep Learning JP
 
PDF
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
 
PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
 
PPTX
PostgreSQL画像データ収集・格納
Ayumi Ishii
 
PDF
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
金融×AIで解くべき問題は何か?
Tsunehiko Nagayama
 
情報検索とゼロショット学習
kt.mako
 
For MANABIYA
ssuserafaae8
 
情報アクセス技術のためのテストコレクション作成
kt.mako
 
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
Yusuke Suzuki
 
ジェネリクスの基礎と クラス設計への応用
nagise
 
モデルアーキテクチャ観点からのDeep Neural Network高速化
Yusuke Uchida
 
保守運用コストの適正化事例 20120725
コシキ・バリューハブ株式会社/KOSHIKI ValueHub
 
ブラック企業から学ぶMVCモデル
Yuta Hiroto
 
優れた研究論文の書き方―7つの提案
Masanori Kado
 
PyQtではじめるGUIプログラミング
Ransui Iso
 
Explanation in Machine Learning and Its Reliability
Satoshi Hara
 
学習時に使ってはいないデータの混入「リーケージを避ける」
西岡 賢一郎
 
ドワンゴにおける新卒エンジニア向けScala研修について
Kota Mizushima
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Yoshitaka Kawashima
 
【DL輪読会】Which Shortcut Cues Will DNNs Choose? A Study from the Parameter-Space...
Deep Learning JP
 
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
 
PostgreSQL画像データ収集・格納
Ayumi Ishii
 
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 

Similar to Pythonでの開発を効率的に進めるためのツール設定 (14)

KEY
ひのきのぼうだけで全クリ目指す
AromaBlack
 
PPTX
ゲーム開発者向けPythonセミナー(2018年06月20日)
Ryo Takahashi
 
PDF
おまえらこのライブラリ使ってないの? m9 (2013-07)
Toru Furukawa
 
PDF
【Pycon2012】unittest嫌いがunitestをtesting
ido_ojos_jp
 
PPTX
Shizuoka.py #6 WebTestでWeb APIのテスト & Pythonメタプログラミングでテストの自動生成
Nao Oec
 
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
 
PDF
書こう! 使おう! 単体テスト
ryohji ikebe
 
PDF
Pythonで始めるDropboxAPI
Daisuke Igarashi
 
PDF
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
aoshiman
 
PPTX
みんなが知らない pytorch-pfn-extras
Takuji Tahara
 
PDF
Machine learning CI/CD with OSS
yusuke shibui
 
PPTX
型チェックのアノテーションによる保守・運用の改善
gree_tech
 
PDF
Tokyor14 - R言語でユニットテスト
Yohei Sato
 
PDF
debug_profile.pdf
Nariaki Tateiwa
 
ひのきのぼうだけで全クリ目指す
AromaBlack
 
ゲーム開発者向けPythonセミナー(2018年06月20日)
Ryo Takahashi
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
Toru Furukawa
 
【Pycon2012】unittest嫌いがunitestをtesting
ido_ojos_jp
 
Shizuoka.py #6 WebTestでWeb APIのテスト & Pythonメタプログラミングでテストの自動生成
Nao Oec
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
 
書こう! 使おう! 単体テスト
ryohji ikebe
 
Pythonで始めるDropboxAPI
Daisuke Igarashi
 
今年使ってみて良かった、Pythonモジュール、パッケージ、ツール
aoshiman
 
みんなが知らない pytorch-pfn-extras
Takuji Tahara
 
Machine learning CI/CD with OSS
yusuke shibui
 
型チェックのアノテーションによる保守・運用の改善
gree_tech
 
Tokyor14 - R言語でユニットテスト
Yohei Sato
 
debug_profile.pdf
Nariaki Tateiwa
 
Ad

More from Atsushi Odagiri (20)

PDF
みんなのPython勉強会#77 パッケージングしよう
Atsushi Odagiri
 
PDF
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
PDF
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri
 
PDF
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri
 
PDF
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri
 
PDF
Pythonとパッケージングと私
Atsushi Odagiri
 
PDF
Python3 移行への軌跡
Atsushi Odagiri
 
PDF
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
PDF
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
PPTX
Clack meetup #1 lt
Atsushi Odagiri
 
PDF
Pyramid入門
Atsushi Odagiri
 
PDF
パッケージングの今
Atsushi Odagiri
 
PDF
パッケージングの今と未来
Atsushi Odagiri
 
PDF
パッケージングの今と未来
Atsushi Odagiri
 
PDF
Bplt11 form alchemy
Atsushi Odagiri
 
PDF
Python3でwebアプリ
Atsushi Odagiri
 
PDF
Pyconjp2012 memory-of-europython
Atsushi Odagiri
 
PDF
What makes pyramid unique
Atsushi Odagiri
 
PDF
エキPy lt repoze.whoの紹介
Atsushi Odagiri
 
PDF
World plonedaylt
Atsushi Odagiri
 
みんなのPython勉強会#77 パッケージングしよう
Atsushi Odagiri
 
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri
 
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri
 
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri
 
Pythonとパッケージングと私
Atsushi Odagiri
 
Python3 移行への軌跡
Atsushi Odagiri
 
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
Clack meetup #1 lt
Atsushi Odagiri
 
Pyramid入門
Atsushi Odagiri
 
パッケージングの今
Atsushi Odagiri
 
パッケージングの今と未来
Atsushi Odagiri
 
パッケージングの今と未来
Atsushi Odagiri
 
Bplt11 form alchemy
Atsushi Odagiri
 
Python3でwebアプリ
Atsushi Odagiri
 
Pyconjp2012 memory-of-europython
Atsushi Odagiri
 
What makes pyramid unique
Atsushi Odagiri
 
エキPy lt repoze.whoの紹介
Atsushi Odagiri
 
World plonedaylt
Atsushi Odagiri
 
Ad

Pythonでの開発を効率的に進めるためのツール設定