Crash when packages and mypy_path discover one file under two module names
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
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.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Exécutez la reproduction minimale avec les paquets et les paramètres mypy_path indiqués, puis suivez l’échec dans errors.py au niveau de add_error_info/_add_error_info, en utilisant messages.py et checkexpr.py comme chemin d’appel signalé. Comparez cela avec le diagnostic existant pour les modules en double et ajoutez une couverture de régression. C’est terminé lorsque l’erreur arg-type ordinaire est signalée une seule fois ou que le mappage des doublons reçoit un diagnostic utile sans plantage interne.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Active
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 65/100