1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

備忘録: uv 利用プロジェクトで pre-commit で mypy を設定したときに .venv のライブラリが参照されない問題の解決方法

Last updated at Posted at 2025-12-05

uvpyproject.toml を管理していることを前提としているが、 uv venv を使っている環境や uv 以外の似た環境でも同様のはず。

元々エラーが出ていた設定

.pre-commit-config.yaml
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 にコマンドが書ける。

.pre-commit-config.yaml (diff)
 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
.pre-commit-config.yaml (コピペ用)
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 にこのように書けば無視できる。

pyproject.toml
[[tool.mypy.overrides]]
module = [
    "パッケージ名.*",
    # ...
]
ignore_missing_imports = true

ライブラリ作者へのお願い

型をつけたら py.typed を置いてください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?