kumilog.net

データ分析やプログラミングの話などを書いています。

Pythonプロジェクトでよく使うライブラリ/ツール2020

はじめに

プライベートや仕事などでPythonを用いた開発を行う際、毎回使うライブラリ/ツールはあるかと思います。 新しく使い始めたものもあれば使わなくなったものあり、時間が経つにつれて少しずつ変化していっているので、個人的な忘備録も兼ねて2020年12月現在でよく用いるライブラリ/ツールについてまとめてみました。 簡単なインストール方法とともに紹介したいと思います。 また、データ分析やWebフレームワークなどは触れません。

基本のライブラリ/ツール

ちょっとしたスクリプトでも入れることの多い基本的なライブラリとツールの紹介です。

pyenv

Pythonのバージョン管理ツールです。複数のバージョンを切り替えて使いたいときに便利です。

github.com

brew install pyenv

仮想環境は標準ライブラリのvenvか次に紹介するpoetryを使うので、 pyenv-virtualenvは使っていないです。

様々な**envをまとめて管理できるanyenvを使っていましたが、ターミナルの起動を早くするためにanyenvはやめました。また、設定でeval "$(pyenv init - --no-rehash)"--no-rehashをつけると起動時にrehashしなくなるので早くなります。

また、rubyのrbenvの影響を受けています。ちなみに、rbenv install -lでは各バージョンの最新版のみ表示されますが、pyenv install -lではすべて表示されるので少し見づらいです。。

Poetry

Pythonのパッケージ管理ツールです。仮想環境の構築も行います。PythonパッケージのビルドやPyPIなどのパッケージ管理サイトへのアップロードもできます。

python-poetry.org

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

パッケージ管理ツールとしてはPipenvがメジャーですが、Poetryは比較的新しいツールで今も開発が盛んです。

Pipenvでできることはだいたいできます。今年、Pipenvから切り替えましたが今の所困ったことはないです。依存関係の解決がPipenvより高速で、Pythonパッケージをビルドや配布はPipenvではできないので、Poetryはおすすめです。

flake8

コーディング規約であるPEP8に従っているかやエラーチェックなど行うLinterです。

gitlab.com

pip install flake8

複数人で開発する場合でも1人の場合でも、とりあえず入れておくと良いと思います。VSCodeで設定していると入れてないとインストールを促してくるので、ちょっとしたスクリプトでも入れることが多いです。

設定は以下をベースに使っています。後述のblackが88行なので、flake8も88行にしています。

[flake8]
max-line-length = 88
convention = google

isort

importの並び替えを行うライブラリです。

github.com

pip install isort

設定は以下を用いています。複数行をどう扱うかはmulti_line_outputで設定できます。こちらの例を見るのが分かりやすいです。blackに合わせるため3の形式にしています。

[isort]
include_trailing_comma = true
line_length = 88
multi_line_output = 3

black

Pythonのコードを自動で整形するツールです。

black.readthedocs.io

pip install black

autopep8yapfと同じくコードフォーマッターですが、後発のツールです。いろいろな書き方をさせないため制限が厳しく、設定ファイルはありますが設定はほとんどできません。

以前はyapfを使っていましたが、最近はblackを使うことが多くなりました。こちらもflake8やisortとセットで基本的にはインストールしています。

開発で使うライブラリ/ツール

一時的な作成する実験的なスクリプトではなく、Gitで管理してGithubにあげるようなプロジェクトで使うライブラリとツールの紹介です。

pre-commit

Gitでコミットする前に実行されるpre-commit hookを管理するツールです。

pre-commit.com

brew install pre-commit
pip install pre-commit

Python製のライブラリなのでpipでインストールできますが、macの場合はhomebrewでもインストールできます。 チェックできるスクリプトはこれまでに紹介したflake8, isort, blackなどのPythonライブラリはもちろん他の言語でも使うことができます。 なので、homebrewでインストールするほうが良いかもしれません。

手動でflake8などのLinterを実行すると忘れることもあるので、自動でチェックできるので便利です。 コードレビューで指摘されたり、CIでエラーになったりすることがなくなるので入れておいて損はないと思います。

設定ファイルはYAML形式で以下のように書きます。拡張ライブラリも使えます。

repos:
  - repo: https://gitlab.com/pycqa/flake8
    rev: 3.8.4
    hooks:
      - id: flake8
        additional_dependencies:
          - flake8-bugbear==20.1.4
          - flake8-docstrings==1.5.0

pre-commit runとコマンドを叩けば、手動で実行することもできます。

flake8-bugbear

flake8-bugbearはバグになりそうなコードを検知するflake8のプラグインです。

github.com

pip install flake8-bugbear

flake8のプラグインなので、flake8を実行するだけで同時に検知できます。

例えば、以下のような文法上は問題ないコードでも、バグが発生しやすいところは検知してくれます。

def f(x=[]):
     pass
./main.py:1:9: B006 Do not use mutable data structures for argument defaults.  They are created during function definition time. All calls to the function reuse this one instance of that data structure, persisting changes between them.

ちなみに、デフォルト引数値は関数定義が実行されるときに評価されるので、ミュータブルなオブジェクトは使用するのは好ましくないです。

flake8-docstrings

flake8を拡張し、docstringのチェックも対応するライブラリです。

gitlab.com

pip install flake8-docstrings

_ではじめまるプライベートメソッドやモジュール以外でdocstringを書いてなかったり、書いている場合でもはじめが大文字で始まってなかったりすると指摘されます。docstringを書く癖をつけるためにも入れておくと良いでしょう。

mypy

型ヒントのチェックを行うツールです。

www.mypy-lang.org

pip install mypy

mypy(というより型ヒント)は最近使い始めました。intstrといったシンプルな型であれば付ける必要はないかもしれませんが、Dict[str, int]のように辞書のキーの型など複雑になればなるほどあると便利だと思います。

ツールの動きとしては、例えば、以下のように引数xの型ヒントはintだけど文字列入れていたり、返り値はstrとしているが、実際は返り値がなかったりするとエラーとして検知します。

def f(x: int) -> str:
    x = "str"
main.py:1: error: Missing return statement  [return]
main.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]

使用している設定は以下です。

[mypy]
ignore_missing_imports = true
show_error_codes = true

まとめ

現時点で使用しているPythonのライブラリやツールに紹介しました。今年から使い始めたものをあるので、来年になったら変わっているかもしれませんが、紹介したものは便利なものばかりだと思いますので参考になれば幸いです。

また、poetryでまとめインストールするには以下のようにすれば可能です。

poetry add --dev flake8 isort black flake8-bugbear flake8-docstrings mypy

Pythonのライブラリについてはawesome-pythonも参考になると思います。