python / python/mypy

List[Literal[...]] type being narrowed where it shouldn't be

Ouverte
#9,850 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug topic-literal-types topic-type-narrowing
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug Report

Adding an if check on a specific index of a List of Literals seems to narrow down its scope, even though the list can be modified and the value at that index can change.

To Reproduce

Run mypy over this piece of code:

foo: List[Literal['a', 'b']] = ['a', 'b', 'a']

if foo[0] == 'a':
    print('a')
    exit()

foo.pop(0)
reveal_type(foo[0])
if foo[0] == 'a':
    pass

Expected Behavior

Revealed type to be Literal['a', 'b'], and the conditional to be valid.

Actual Behavior

t.py:11: note: Revealed type is 'Literal['b']'
t.py:12: error: Non-overlapping equality check (left operand type: "Literal['b']", right operand type: "Literal['a']")

Your Environment

  • Mypy version used: 0.790
  • Mypy command-line flags: --strict
  • Python version used: 3.9.1 64-bit
  • Operating system and version: Fedora 33 x86_64

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 exécuter le reproducteur Python fourni avec mypy 0.790 et examinez le comportement de la réduction de type pour les Lists mutables indexées de Literals. Suivez le point d’entrée de la réduction pour foo[0] à travers le checker ; c’est terminé lorsque reveal_type(foo[0]) reste Literal['a', 'b'] après pop(0) et que la vérification d’égalité ultérieure est acceptée.

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é
Clairement spécifiée
Accessibilité débutants
42/100

Recevez les nouvelles issues par e-mail

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