ハイパーモダンPython

ハイパーモダンPythonを読んだ覚え書き。

1章 Pythonのインストール

python-launcherが便利らしい。 hpython-launcherからpythonインタプリタを起動するとインタプリタやvenvを自動的に検出してくれる。

$ brew install python-launcher
$ brew install python@3.12 python@3.11 python@3.10

FedoraなどのRHEL系OSはpythonと密接に関わっているので無闇にpythonをグローバルインストールしないのが良いとのこと。

2章 Python環境

グローバル環境を汚さないためにvenvを使う。

python-launcherと合わせて使うことでいちいち source .venv/bin/activate を実行しなくて良くなる。 py -m pip を使うとvenv環境に対してパッケージをインストールしてくれるとのこと。

$ py -m venv .venv
$ py -m pip install httpx

グローバルにパッケージをインストールしたいときはpipxを使う。

pipxはパッケージを仮想環境にインストールしておき、エントリポイントを $PATH 上に作成することでどこからでもパッケージを呼び出せるようにするという思想。賢い。

$ pipx list
venvs are in /home/nagu/.local/pipx/venvs
apps are exposed on your $PATH at /home/nagu/.local/bin
   package black 24.10.0, installed using Python 3.9.18
    - black
    - blackd
   package hatch 1.13.0, installed using Python 3.9.18
    - hatch
   package hatch-vcs 0.4.0, installed using Python 3.9.18
    - hatchling

$ ls -l ~/.local/bin
total 0
lrwxrwxrwx. 1 nagu nagu 44 Nov 22 15:45 black -> /home/nagu/.local/pipx/venvs/black/bin/black
lrwxrwxrwx. 1 nagu nagu 45 Nov 22 15:45 blackd -> /home/nagu/.local/pipx/venvs/black/bin/blackd
lrwxrwxrwx. 1 nagu nagu 44 Nov 22 15:46 hatch -> /home/nagu/.local/pipx/venvs/hatch/bin/hatch
lrwxrwxrwx. 1 nagu nagu 52 Nov 22 15:47 hatchling -> /home/nagu/.local/pipx/venvs/hatch-vcs/bin/hatchling

3章 Pythonパッケージ

pyproject.tomlを使ったプロジェクト管理入門のような内容。 あまり使わなそうなためスキップ。

4章 依存関係の管理

バージョン指定子は、許容できるバージョンの範囲を指定します。新しい依存関係を追加する際は、そのパッケージの現在のバージョンを下限値として指定するとよいでしょう。また、そのパッケージの新しい機能に依存するようになったら下限を更新してください。

憶測でバージョンの上限を指定しないでください。新しいリリースがプロジェクトと互換性がないと確信できる場合を除いて、上限を制限するべきではありません。

Pythonは各パッケージの特定バージョンしかインストールできないため、上限を設定すると他のパッケージが指定するバージョンとコンフリクトする可能性が高まる。上限はできる限り設定しないのが良いらしい。

venvを使っててもそうなのか…?
→ プロジェクトが依存しているパッケージAとパッケージBがパッケージCのv1.2とv2.0に依存しているとvenv環境でもコンフリクトするかも。

6章 pytestによるテスト

ここから先はパッケージの使い方紹介みたいな内容だったので流し読み。
いつかpytest使う日が来たらきちんと読み返そうと思う。

7章 Coverage.pyによるカバレッジ測定

テストカバレッジはテスト感度の上限として見れるという話。テストカバレッジが高いことが必ずしもテストの感度が高いことにはならない。

8章 Noxによる自動化

Noxというものでビルド・テストなんでもできる様子。メモ。

9章 Ruffとpre-commitによるリント

Pythonリンタ略史が面白い。昔はFlake8を使っていた記憶がフラッシュバックする。
現代ではRuff入れとけば大体問題ないということが記されている。

10章 安全性とインスペクションのための型アノテーション

pythonに型アノテーションを付けることで型チェックができるようになる。

大昔のコードに書いてあるlistやdictは何を期待しているのかぱっとわからないので型アノテーションが欲しい。

lines: list[str] = []

fruits: dict[str, int] = {
    "banana": 3,
    "apple": 2,
    "orange": 1,
}