Protocol incorrectly matches when positional or keyword parameter matches *args
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
Bug Report
When a protocol defines a function with a keyword or positional parameter (a: int) -> None, a concrete function where said parameter is missing, but matches the *args parameter (*args: int) -> None will be seen as implementing the protocol.
I would expect (a: int) -> None to also need matching **kwargs such as (*args: int, **kwargs: int) -> None and for it to only match *args alone when specified as a positional only argument (e.g. (a: int, /) -> None)
Otherwise it cannot be called safely, pyright and ty both successfully raise errors for this case.
To Reproduce
https://mypy-play.net/?mypy=master&python=3.14&flags=strict&gist=a5f86e32e70cbc84c45a53db5426f78f
Expected Behavior
main.py:13: error: Argument 1 to "f" has incompatible type "C"; expected "P" [arg-type]
because calling the method as foo(a=1) would fail.
Actual Behavior
mypy:
Success: no issues found in 1 source file
pyright:
Argument of type "C" cannot be assigned to parameter "o" of type "P" in function "f"
"C" is incompatible with protocol "P"
"foo" is an incompatible type
Type "(*args: int) -> None" is not assignable to type "(a: int) -> None"
Missing keyword parameter "a" (reportArgumentType)
ty:
Argument to function `f` is incorrect: Expected `P`, found `C` (invalid-argument-type) [Ln 17, Col 3]
python:
Traceback (most recent call last):
File "xxx.py", line 17, in <module>
f(C())
~^^^^^
File "xxx.py", line 14, in f
o.foo(a=1)
~~~~~^^^^^
TypeError: C.foo() got an unexpected keyword argument 'a'
Your Environment
- Mypy version used: 1.19.1 and master
- Mypy command-line flags:
--strict - Mypy configuration options from
mypy.ini(and other config files): - Python version used:
1.14
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
Reproduire l’exemple mypy-play lié avec mypy master, Python 3.14 et --strict. Suivre le traitement de la compatibilité des protocoles pour les signatures foo présentées et comparer le résultat avec pyright et ty. Le travail est terminé lorsque mypy signale l’erreur incompatible-protocol attendue tout en préservant le cas positional-only.
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é
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 42/100