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

Atsushi Odagiri
Atsushi Odagiriopen collector
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 に導入してみましょう
1 of 54

Recommended

FastAPIのテンプレートプロジェクトがいい感じだった話 by
FastAPIのテンプレートプロジェクトがいい感じだった話FastAPIのテンプレートプロジェクトがいい感じだった話
FastAPIのテンプレートプロジェクトがいい感じだった話NipponAlgorithm
1.3K views18 slides
こわくない Git by
こわくない Gitこわくない Git
こわくない GitKota Saito
881.2K views186 slides
Apache Avro vs Protocol Buffers by
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
5.3K views33 slides
君はyarn.lockをコミットしているか? by
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
30.4K views25 slides
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング by
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリングmlm_kansai
67.5K views43 slides
RailsGirls から始める エンジニアリングはじめの一歩 by
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩Hiroshi SHIBATA
845 views16 slides

More Related Content

What's hot

PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築 by
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築Kosuke Shinoda
1.5K views19 slides
例外設計における大罪 by
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
68.5K views37 slides
エンジニアの個人ブランディングと技術組織 by
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
23.3K views40 slides
20230216_Python機械学習プログラミング.pdf by
20230216_Python機械学習プログラミング.pdf20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdfShintaro Fukushima
568 views22 slides
暗号技術の実装と数学 by
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
9.6K views35 slides
Prophet入門【Python編】Facebookの時系列予測ツール by
Prophet入門【Python編】Facebookの時系列予測ツールProphet入門【Python編】Facebookの時系列予測ツール
Prophet入門【Python編】Facebookの時系列予測ツールhoxo_m
64.6K views61 slides

What's hot(20)

PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築 by Kosuke Shinoda
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
Kosuke Shinoda1.5K views
例外設計における大罪 by Takuto Wada
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada68.5K views
エンジニアの個人ブランディングと技術組織 by Takafumi ONAKA
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA23.3K views
20230216_Python機械学習プログラミング.pdf by Shintaro Fukushima
20230216_Python機械学習プログラミング.pdf20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdf
Shintaro Fukushima568 views
Prophet入門【Python編】Facebookの時系列予測ツール by hoxo_m
Prophet入門【Python編】Facebookの時系列予測ツールProphet入門【Python編】Facebookの時系列予測ツール
Prophet入門【Python編】Facebookの時系列予測ツール
hoxo_m64.6K views
異次元のグラフデータベースNeo4j by 昌桓 李
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
昌桓 李13.1K views
情報抽出入門 〜非構造化データを構造化させる技術〜 by Yuya Unno
情報抽出入門 〜非構造化データを構造化させる技術〜情報抽出入門 〜非構造化データを構造化させる技術〜
情報抽出入門 〜非構造化データを構造化させる技術〜
Yuya Unno37.9K views
AWSではじめるMLOps by MariOhbuchi
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi3.2K views
組み込みでこそC++を使う10の理由 by kikairoya
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya27K views
エンジニアから飛んでくるマサカリを受け止める心得 by Reimi Kuramochi Chiba
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba64.4K views
グラフ構造のデータモデルをPower BIで可視化してみた by CData Software Japan
グラフ構造のデータモデルをPower BIで可視化してみたグラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみた
BuildKitによる高速でセキュアなイメージビルド by Akihiro Suda
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda42.5K views
Webアプリを並行開発する際のマイグレーション戦略 by Takayuki Shimizukawa
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱 by Yuya Rin
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
Yuya Rin6.1K views
Django REST Framework における API 実装プラクティス | PyCon JP 2018 by Masashi Shibata
Django REST Framework における API 実装プラクティス | PyCon JP 2018Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Masashi Shibata14.2K views
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2 by Preferred Networks
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Preferred Networks5.7K views

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

Getting Started with Testing using PHPUnit by
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
1.2K views40 slides
TestFlight自動化でらくらくチームテスト by
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストYoichiro Sakurai
5.8K views35 slides
ひのきのぼうだけで全クリ目指す by
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すAromaBlack
1.5K views35 slides
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12 by
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12Takanori Suzuki
3K views96 slides
Start python with fastapi by
Start python with fastapiStart python with fastapi
Start python with fastapiku_taka
273 views58 slides
あなたの安心を高速に守る Container-based CI by
あなたの安心を高速に守る Container-based CIあなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CIWataru MIYAGUNI
6.5K views96 slides

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

Getting Started with Testing using PHPUnit by Atsuhiro Kubo
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
Atsuhiro Kubo1.2K views
TestFlight自動化でらくらくチームテスト by Yoichiro Sakurai
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
Yoichiro Sakurai5.8K views
ひのきのぼうだけで全クリ目指す by AromaBlack
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
AromaBlack1.5K views
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12 by Takanori Suzuki
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
Takanori Suzuki3K views
Start python with fastapi by ku_taka
Start python with fastapiStart python with fastapi
Start python with fastapi
ku_taka273 views
あなたの安心を高速に守る Container-based CI by Wataru MIYAGUNI
あなたの安心を高速に守る Container-based CIあなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CI
Wataru MIYAGUNI6.5K views
「Python言語」はじめの一歩 / First step of Python by Takanori Suzuki
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
Takanori Suzuki65.9K views
【更新版】20190628玉川大学脳トレ社会科学oTree演習編 by Akira Goto
【更新版】20190628玉川大学脳トレ社会科学oTree演習編【更新版】20190628玉川大学脳トレ社会科学oTree演習編
【更新版】20190628玉川大学脳トレ社会科学oTree演習編
Akira Goto1.5K views
Introduction to Continuous Test Runner MakeGood by Atsuhiro Kubo
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo1.2K views
おまえらこのライブラリ使ってないの? m9 (2013-07) by Toru Furukawa
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
Toru Furukawa3.1K views
Behat Driven Development by Ryo Tomidokoro
Behat Driven DevelopmentBehat Driven Development
Behat Driven Development
Ryo Tomidokoro13.8K views
Pyconjp2014_implementations by masahitojp
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
masahitojp4.7K views
Using PyFoam as library(第25回オープンCAE勉強会@関西) by TatsuyaKatayama
Using PyFoam as library(第25回オープンCAE勉強会@関西)Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)
TatsuyaKatayama2.9K views
パッケージングの今 by Atsushi Odagiri
パッケージングの今パッケージングの今
パッケージングの今
Atsushi Odagiri22.6K views
Gui自動テストツール基本 by Tsuyoshi Yumoto
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本
Tsuyoshi Yumoto390 views
kunibiki.rb #5 発表資料 by yoshioka_cb
kunibiki.rb #5 発表資料kunibiki.rb #5 発表資料
kunibiki.rb #5 発表資料
yoshioka_cb330 views
ワンクリックデプロイ101 #ocdeploy by Ryutaro YOSHIBA
ワンクリックデプロイ101 #ocdeployワンクリックデプロイ101 #ocdeploy
ワンクリックデプロイ101 #ocdeploy
Ryutaro YOSHIBA12.9K views

More from Atsushi Odagiri

みんなのPython勉強会#77 パッケージングしよう by
みんなのPython勉強会#77 パッケージングしようみんなのPython勉強会#77 パッケージングしよう
みんなのPython勉強会#77 パッケージングしようAtsushi Odagiri
1.8K views46 slides
async/await の向こう側 PyCon Kyushu 2022 by
async/await の向こう側 PyCon Kyushu 2022async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022Atsushi Odagiri
263 views51 slides
パッケージングの呼び声 Python Charity Talks in Japan 2021.02 by
パッケージングの呼び声 Python Charity Talks in Japan 2021.02パッケージングの呼び声 Python Charity Talks in Japan 2021.02
パッケージングの呼び声 Python Charity Talks in Japan 2021.02Atsushi Odagiri
4.5K views32 slides
eggとはなんだったのか 栄光のsetuptools by
eggとはなんだったのか 栄光のsetuptoolseggとはなんだったのか 栄光のsetuptools
eggとはなんだったのか 栄光のsetuptoolsAtsushi Odagiri
685 views27 slides
pyconjp 2019 LT 今日のsetuptools by
pyconjp 2019 LT 今日のsetuptoolspyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptoolsAtsushi Odagiri
5.9K views18 slides
Pythonとパッケージングと私 by
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私Atsushi Odagiri
19K views41 slides

More from Atsushi Odagiri(20)

みんなのPython勉強会#77 パッケージングしよう by Atsushi Odagiri
みんなのPython勉強会#77 パッケージングしようみんなのPython勉強会#77 パッケージングしよう
みんなのPython勉強会#77 パッケージングしよう
Atsushi Odagiri1.8K views
async/await の向こう側 PyCon Kyushu 2022 by Atsushi Odagiri
async/await の向こう側 PyCon Kyushu 2022async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri263 views
パッケージングの呼び声 Python Charity Talks in Japan 2021.02 by Atsushi Odagiri
パッケージングの呼び声 Python Charity Talks in Japan 2021.02パッケージングの呼び声 Python Charity Talks in Japan 2021.02
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri4.5K views
eggとはなんだったのか 栄光のsetuptools by Atsushi Odagiri
eggとはなんだったのか 栄光のsetuptoolseggとはなんだったのか 栄光のsetuptools
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri685 views
pyconjp 2019 LT 今日のsetuptools by Atsushi Odagiri
pyconjp 2019 LT 今日のsetuptoolspyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri5.9K views
Pythonとパッケージングと私 by Atsushi Odagiri
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
Atsushi Odagiri19K views
パッケージングを支える技術 pyconjp2016 by Atsushi Odagiri
パッケージングを支える技術 pyconjp2016パッケージングを支える技術 pyconjp2016
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri4.4K views
パッケージングの今と未来 by Atsushi Odagiri
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
Atsushi Odagiri12.2K views
パッケージングの今と未来 by Atsushi Odagiri
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
Atsushi Odagiri6.8K views
Pyconjp2012 memory-of-europython by Atsushi Odagiri
Pyconjp2012 memory-of-europythonPyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europython
Atsushi Odagiri974 views
エキPy lt repoze.whoの紹介 by Atsushi Odagiri
エキPy lt repoze.whoの紹介エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介
Atsushi Odagiri1.2K views

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