Can't assign result of list addition to list variable covariantly
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
I cannot assign a list[int] to a list[int | None] if I make it using addition. However, it works fine if I don't use addition. See the tiny example below.
In this example, of course, I can avoid the problem using the list literal [1, 2], but in the application code where I'm facing this issue I actually need to add two comprehensions and store the result as a variable. It shows the same unexpected behavior.
To Reproduce
a: list[int | None] = [1] # allowed
b: list[int | None] = [1] + [2] # not allowed
https://mypy-play.net/?mypy=latest&python=3.12&gist=800cfe12c8689a108440e71e641ad240
Expected Behavior
I expect mypy to behave in one of two ways:
- Both lines are allowed 👈 this would be very convenient
- Both lines are not allowed 👈 this would be correct
- How can the first line be allowed if
listis invariant? - In this case I would need a way to type-hint a list comprehension
- How can the first line be allowed if
Note:
I expect both lines to be treated the same way. This expectation is reinforced because reveal_type([1]) reports the same type as reveal_type([1] + [2]). If that was not the case the different treatment would be easier to understand.
Actual Behavior
main.py:2: error: Incompatible types in assignment (expression has type "list[int]", variable has type "list[int | None]") [assignment]
main.py:2: note: "List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance
main.py:2: note: Consider using "Sequence" instead, which is covarian
Your Environment
- Mypy version used:
1.8.0and1.5.1(latest and version in use on my project) - Mypy command-line flags:
none - Mypy configuration options from
mypy.ini(and other config files):none - Python version used:
3.12
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
Commencez par la reproduction minimale dans main.py et exécutez-la avec l’exemple mypy-play lié en utilisant les versions de Python et de mypy signalées. Suivez la manière dont sont inférées les expressions de littéral de liste et d’addition de listes, puis rendez leur comportement d’affectation cohérent tout en préservant l’invariance des listes ; ajoutez ou mettez à jour un test de régression pour les deux formes.
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
- 35/100