SlideShare a Scribd company logo
1 of 54
Download to read offline
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

不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
Shintaro Fukushima
 

What's hot (20)

XAI (説明可能なAI) の必要性
XAI (説明可能なAI) の必要性XAI (説明可能なAI) の必要性
XAI (説明可能なAI) の必要性
 
ゼロから始める自然言語処理 【FIT2016チュートリアル】
ゼロから始める自然言語処理 【FIT2016チュートリアル】ゼロから始める自然言語処理 【FIT2016チュートリアル】
ゼロから始める自然言語処理 【FIT2016チュートリアル】
 
みんなのPython勉強会#77 パッケージングしよう
みんなのPython勉強会#77 パッケージングしようみんなのPython勉強会#77 パッケージングしよう
みんなのPython勉強会#77 パッケージングしよう
 
App013 ここはあえて紙と
App013 ここはあえて紙とApp013 ここはあえて紙と
App013 ここはあえて紙と
 
研究発表を準備する(2022年版)
研究発表を準備する(2022年版)研究発表を準備する(2022年版)
研究発表を準備する(2022年版)
 
機械学習モデルの判断根拠の説明
機械学習モデルの判断根拠の説明機械学習モデルの判断根拠の説明
機械学習モデルの判断根拠の説明
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
 
リーン開発の本質 公開用
リーン開発の本質 公開用リーン開発の本質 公開用
リーン開発の本質 公開用
 
ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
 
Machine Learning Night - Preferred Networksの顧客向けプロダクト開発 - 谷脇大輔
Machine Learning Night - Preferred Networksの顧客向けプロダクト開発 - 谷脇大輔Machine Learning Night - Preferred Networksの顧客向けプロダクト開発 - 谷脇大輔
Machine Learning Night - Preferred Networksの顧客向けプロダクト開発 - 谷脇大輔
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
 
KDD Cup 2021 時系列異常検知コンペ 参加報告
KDD Cup 2021 時系列異常検知コンペ 参加報告KDD Cup 2021 時系列異常検知コンペ 参加報告
KDD Cup 2021 時系列異常検知コンペ 参加報告
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジー
 
Pythonと型チェッカー
Pythonと型チェッカーPythonと型チェッカー
Pythonと型チェッカー
 
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings  (EMNLP 2021)【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings  (EMNLP 2021)
【DL輪読会】SimCSE: Simple Contrastive Learning of Sentence Embeddings (EMNLP 2021)
 

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

Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
Atsuhiro Kubo
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
Yoichiro Sakurai
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
Toru Furukawa
 
Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)
TatsuyaKatayama
 
パッケージングの今
パッケージングの今パッケージングの今
パッケージングの今
Atsushi Odagiri
 

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

Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
 
Start python with fastapi
Start python with fastapiStart python with fastapi
Start python with fastapi
 
あなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CIあなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CI
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
【更新版】20190628玉川大学脳トレ社会科学oTree演習編
【更新版】20190628玉川大学脳トレ社会科学oTree演習編【更新版】20190628玉川大学脳トレ社会科学oTree演習編
【更新版】20190628玉川大学脳トレ社会科学oTree演習編
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
PHP agile test tips
PHP agile test tipsPHP agile test tips
PHP agile test tips
 
Behat Driven Development
Behat Driven DevelopmentBehat Driven Development
Behat Driven Development
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)
 
perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)
 
パッケージングの今
パッケージングの今パッケージングの今
パッケージングの今
 
Gui自動テストツール基本
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本
 
kunibiki.rb #5 発表資料
kunibiki.rb #5 発表資料kunibiki.rb #5 発表資料
kunibiki.rb #5 発表資料
 
ワンクリックデプロイ101 #ocdeploy
ワンクリックデプロイ101 #ocdeployワンクリックデプロイ101 #ocdeploy
ワンクリックデプロイ101 #ocdeploy
 

More from Atsushi Odagiri

Sqlalchemy sqlの錬金術
Sqlalchemy  sqlの錬金術Sqlalchemy  sqlの錬金術
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
Atsushi Odagiri
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
Atsushi Odagiri
 
Pyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europythonPyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europython
Atsushi Odagiri
 
What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid unique
Atsushi Odagiri
 
エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介
Atsushi Odagiri
 
BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3
Atsushi Odagiri
 

More from Atsushi Odagiri (20)

async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022
 
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
パッケージングの呼び声 Python Charity Talks in Japan 2021.02パッケージングの呼び声 Python Charity Talks in Japan 2021.02
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
 
eggとはなんだったのか 栄光のsetuptools
eggとはなんだったのか 栄光のsetuptoolseggとはなんだったのか 栄光のsetuptools
eggとはなんだったのか 栄光のsetuptools
 
pyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptoolspyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptools
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
 
Python3 移行への軌跡
Python3 移行への軌跡Python3 移行への軌跡
Python3 移行への軌跡
 
パッケージングを支える技術 pyconjp2016
パッケージングを支える技術 pyconjp2016パッケージングを支える技術 pyconjp2016
パッケージングを支える技術 pyconjp2016
 
Sqlalchemy sqlの錬金術
Sqlalchemy  sqlの錬金術Sqlalchemy  sqlの錬金術
Sqlalchemy sqlの錬金術
 
Clack meetup #1 lt
Clack meetup #1 ltClack meetup #1 lt
Clack meetup #1 lt
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
 
Bplt11 form alchemy
Bplt11 form alchemyBplt11 form alchemy
Bplt11 form alchemy
 
Python3でwebアプリ
Python3でwebアプリPython3でwebアプリ
Python3でwebアプリ
 
Pyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europythonPyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europython
 
What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid unique
 
エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介
 
World plonedaylt
World plonedayltWorld plonedaylt
World plonedaylt
 
Setup.pysetup.cfg
Setup.pysetup.cfgSetup.pysetup.cfg
Setup.pysetup.cfg
 
BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3
 

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