python / python/mypy

Can't assign result of list addition to list variable covariantly

Ouverte
#16,773 0 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug
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 list is invariant?
    • In this case I would need a way to type-hint a list comprehension

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.0 and 1.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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. 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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.