python / python/mypy

Eager narrowing to `Literal` when possible

Ouverte
#15,434 2 commentaires 4 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature 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

Feature

I often feel I have to put too much effort into informing mypy that some variables can only hold a finite set of values. It would be helpful if mypy was a bit smarter in the way it infers Literal types.

Pitch

Here are some concrete examples:

from typing import Literal

def letter_v1(number: int) -> Literal["a", "b", "c"]:
    if number == 1:
        letter = "a"
    elif number == 2:
        letter = "b"
    else:
        letter = "c"
    
    # Incompatible return value type (got "str", expected "Literal['a', 'b', 'c']")  [return-value]
    return letter
    
def letter_v2(number: int) -> Literal["a", "b", "c"]:
    letter = "a" if number == 1 else "b" if number == 2 else "c"
    
    # Incompatible return value type (got "str", expected "Literal['a', 'b', 'c']")  [return-value]
    return letter

def letter_v3(number: int) -> Literal["a", "b", "c"]:
    letter = ("a", "b", "c")[number]
    
    # Incompatible return value type (got "str", expected "Literal['a', 'b', 'c']")  [return-value]
    return letter

See also: https://mypy-play.net/?mypy=1.3.0&python=3.11&flags=strict&gist=bab569e05877621b90f081fc7bdb7d05

Ideally, I think I should get away without having to specify the type of letter in any of the concrete examples here. A human reviewing this code would easily conclude that there is no issue here, yet mypy struggles.

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

Reproduisez les trois exemples letter_v1, letter_v2 et letter_v3 en utilisant le cas mypy-play lié, puis suivez la manière dont mypy infère les types des variables locales. Déterminez le comportement de narrowing attendu et ajoutez une couverture de régression pour les exemples ; le travail est considéré comme terminé lorsque les fonctions annotées passent le typage sans types explicites pour letter.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
compilers
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
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.