Exhaustiveness checking fails on non-trivial use of pattern matching
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 35/100
Piste de recherche
Commencez par reproduire les deux exemples avec assert_never(), match-case, les motifs Sequence et l’attribut Enum enveloppé montré dans l’issue. Suivez le comportement d’exhaustivité et de narrowing de mypy pour ces cas ; le travail est terminé lorsque les matches non triviaux pris en charge sont reconnus comme exhaustifs sans les erreurs de type signalées, avec une couverture pour les exemples.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Code using assert_never() to ensure exhaustive use of match-case yields a type error on many non-trivial cases.
mypy can only verify exhaustiveness when matching directly against a Union type or Enum value.
Though, proving the exhaustiveness of non-trivial matches may be beyond mypy domain. Here are a couple of examples for the sake of argument:
Matching on both [] and [x, *xs] on Sequence will not narrow the type
from collections.abc import Sequence
from typing import assert_never
def my_sum(s: Sequence[float]) -> float:
match s:
case []:
return 0
case [num, *rest]:
return num + my_sum(rest)
case _ as u:
# error: Argument 1 to "assert_never" has incompatible type "Sequence[float]"; expected "NoReturn"
return assert_never(u)
Matching against all Enum values that a single-member wrapper class may contain
import dataclasses, enum
from typing import assert_never, final
class E(enum.Enum):
A = enum.auto()
B = enum.auto()
@final
@dataclasses.dataclass(frozen=True)
class Foo:
x: E
def match_enum_attribute(f: Foo) -> None:
match f:
case Foo(E.A):
pass
case Foo(E.B):
pass
case _ as r:
# error: Argument 1 to "assert_never" has incompatible type "Foo"; expected "NoReturn" [arg-type]
assert_never(r)
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
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.
Autres issues de python/mypy
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
bug topic-configuration topic-error-reporting
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Toutes les issues de python/mypy
Issues similaires
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
bancolombia/sentinel#23 ·
-
test md OuverteCI
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100