python / python/mypy

Crash when packages and mypy_path discover one file under two module names

オープン
#21,889 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

crash
主要言語
Python
スター
20.6k
フォーク
3.3k
PR マージ指標
PR 指標を取得中

説明

Mypy crashes while reporting an ordinary type error when one physical package is discovered under two configured package roots. The existing duplicate-module diagnostic does not catch this packages + mypy_path configuration.

Minimal reproduction

Directory layout:

pyproject.toml
src/
  outer/
    __init__.py
    inner/
      example/
        __init__.py
        module.py

pyproject.toml:

[tool.mypy]
python_version = "3.14"
strict = true
mypy_path = ["src", "src/outer/inner"]
packages = ["outer", "example"]
explicit_package_bases = true

src/outer/inner/example/module.py:

def takes_int(value: int) -> None:
    pass


def broken() -> None:
    takes_int("not an int")

The __init__.py files are empty.

$ uv run --no-project --with mypy==2.3.1 mypy --no-incremental --show-traceback
src/outer/inner/example/module.py:6: error: Argument 1 to "takes_int" has incompatible type "str"; expected "int"  [arg-type]
.../src/outer/inner/example/module.py:6: error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 2.3.1
.../src/outer/inner/example/module.py:6: note: use --pdb to drop into pdb
Traceback (most recent call last):
  File "mypy/checkexpr.py", line 6163, in accept
  File "mypy/checkexpr.py", line 499, in visit_call_expr
  File "mypy/checkexpr.py", line 630, in visit_call_expr_inner
  File "mypy/checkexpr.py", line 1498, in check_call_expr_with_callee_type
  File "mypy/checkexpr.py", line 1591, in check_call
  File "mypy/checkexpr.py", line 1873, in check_callable_call
  File "mypy/checkexpr.py", line 2762, in check_argument_types
  File "mypy/checkexpr.py", line 2799, in check_arg
  File "mypy/messages.py", line 812, in incompatible_argument
  File "mypy/messages.py", line 282, in fail
  File "mypy/messages.py", line 260, in report
  File "mypy/errors.py", line 680, in report
  File "mypy/errors.py", line 810, in add_error_info
  File "mypy/errors.py", line 684, in _add_error_info
    assert file not in self.flushed_files
AssertionError

Expected: report the ordinary arg-type error once, or reject the duplicate physical-file/module-name mapping with a useful diagnostic. Mypy should not crash.

This also reproduces on current master d32c4d38770745dd9fb6a0279204425e6070e6ad (2.4.0+dev.d32c4d).

Environment

  • macOS arm64
  • Python 3.14.7
  • mypy 2.3.1 compiled wheel

Prior issue search

This seems to be a similar underlying duplicate-file condition as #4881 and #7510, but both are closed because mypy added a "Source file found twice under different module names" diagnostic. That diagnostic does not prevent this configuration-driven variant in 2.3.1 or current master.

AI Disclosure

gpt-5.6-sol used to synthesize the minimal reproducer. I've reproduced this manually.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

指定されたパッケージと mypy_path 設定で最小再現を実行し、messages.py と checkexpr.py を報告された呼び出しパスとして使用して、errors.py の add_error_info/_add_error_info を通じて失敗を追跡します。これを既存の重複モジュール診断と比較し、回帰テストのカバレッジを追加します。通常の arg-type エラーが一度だけ報告されるか、重複マッピングが内部クラッシュなしで有用な診断を受け取れば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
devtools
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
明確に書かれている
初心者へのやさしさ
65/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。