Type narrowing and PEP 634 pattern matching
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
Description
Feature
Narrowing a type in a case block that matches the True result of a type-narrowing expression.
Pitch
Hi all- I'd be curious to hear opinions on how realistic the above would be. Here's an example of something that would work if this were implemented:
a: str | None = "hello"
match a is not None: # or `match isinstance(a, str)`, etc.
case True:
print("'a' is a string", a.encode()) # currently: Item "None" of "str | None" has no attribute "encode"
case False:
print("'a' is None")
My "pitch" is simply that this feels like it should work (even though it makes sense to me why it doesn't). I think this feeling comes from the fact that, at least on the surface:
if thing:
blah()
else:
whatev()
seems morally equivalent to
match thing:
case True:
blah()
case False:
whatev()
Since I don't have any background with mypy's internals, I'm hoping to hear from the team here how feasible this all sounds.
For context, I ran into this issue when I had a type-narrowing expression embedded in a larger scrutinee (in practice, I can't imagine using match over if if the only thing I were testing was the result of a single type-narrowing expression). Specifically, I was creating a decision table of sorts, and match seemed like a nice way to do that without having to repeat tests:
content: str | bytes
is_text_format: bool
match isinstance(content, str), is_text_format:
case True, True:
prepped = content
case True, False:
prepped = content.encode("utf-8") # type narrowing useful here
case False, True:
prepped = content.decode("utf-8") # and here
case False, False:
prepped = content
...
I'm sure there are better ways to tackle this bool-centric example, but I think the general question stands on its own outside my original context.
Thank you for your consideration!
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 les deux exemples de match de l’issue et comparez leur comportement de narrowing demandé aux diagnostics actuels de mypy. L’issue n’identifie aucun fichier source, test ou point d’entrée ; localiser l’implémentation du pattern matching et du type narrowing ferait donc partie du travail. C’est terminé lorsque les branches True et False restreignent l’expression examinée de manière cohérente, y compris pour les scrutinees de tuples.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 25/100