uv で pyproject.toml を管理していることを前提としているが、 uv venv を使っている環境や uv 以外の似た環境でも同様のはず。
元々エラーが出ていた設定
repos:
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.19.0
hooks:
- id: mypy
args: [--config-file=pyproject.toml, src]
files: ^src/
pass_filenames: false
仕組みをよく分かっていないが、この場合、mypyが別環境でインストールされ、 .venv 上で動いているものとは別のPythonインタープリターで動くため、 .venv/lib/python3.??/site-packages が見えないらしい。
uv の用意したPythonインタープリターを利用する設定
mirrors-mypy を使うのがよくなく、 local を指定するらしい。その際、 entry にコマンドが書ける。
repos:
- - repo: https://github.com/pre-commit/mirrors-mypy
- rev: v1.19.0
+ - repo: local
hooks:
- id: mypy
+ name: mypy
+ language: system
+ entry: uv run mypy
args: [--config-file=pyproject.toml, src]
files: ^src/
pass_filenames: false
repos:
- repo: local
hooks:
- id: mypy
name: mypy
language: system
entry: uv run mypy
args: [--config-file=pyproject.toml, src]
files: ^src/
pass_filenames: false
もちろん uv から mypy が使えるようにしておくことは必要。
uv add --dev mypy
これで、 .venv にあるライブラリが参照されない問題は解決する。
py.typed や .pyi がないライブラリを無視する
.venv が見られるようになっても、確かにインストールされているはずのライブラリで error: Cannot find implementation or library stub for module named "***" [import-not-found] が出るなら、そのプロジェクトに py.typed (型付けをしたことを示すファイル) が含まれていない可能性が高い。
これは結構、罠だと思う。実はPythonの仕様では、単に型アノテーションを付けただけでは、パッケージが型チェックをサポートしているとはみなされず、ソースディレクトリに py.typed という名前のファイルを置くことで、型がついているとみなされる。詳しくはこのへんを見てほしい。
.venv/lib/python3.xx/site-packages/パッケージ名 にそれを置いてもいいんだけど、仮想環境を再構築するとなくなるなどメンテナンス性が悪いためおすすめしない。自分で *.pyi を書いてもいいけど、さすがに面倒でやりたくないと思う。現実的には、仕方ないので無視しましょうということになる。
pyproject.toml にこのように書けば無視できる。
[[tool.mypy.overrides]]
module = [
"パッケージ名.*",
# ...
]
ignore_missing_imports = true
ライブラリ作者へのお願い
型をつけたら py.typed を置いてください!