mypy does not deduce more specific type of generic based on isinstance of attribute
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
The following code:
from dataclasses import dataclass
from typing import Generic, TypeVar, Union
T_co = TypeVar("T_co", covariant=True)
@dataclass(frozen=True)
class Foo(Generic[T_co]):
bar: T_co
def handle_foo_int(foo: Foo[int]) -> None:
pass
def handle_foo(foo: Foo[Union[int, str]]) -> None:
if isinstance(foo.bar, int):
handle_foo_int(foo)
Results in the following error from mypy:
$ mypy test.py
test.py:17: error: Argument 1 to "handle_foo_int" has incompatible type "Foo[Union[int, str]]"; expected "Foo[int]"
If foo.bar is an int, it seems to me that it should imply that foo is a Foo[int]. Is there a way to get mypy to deduce that?
I tested this on 0.761 and 0.770+dev.7af3191246c17a8580acd3b6336f35b02de85e7e.
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 le reproducer dans test.py et exécutez-le avec mypy pour confirmer l’erreur signalée. Étudiez l’interaction entre les vérifications isinstance sur les attributs et le rétrécissement des types génériques ; le travail est terminé lorsque l’exemple peut transmettre Foo[Union[int, str]] à handle_foo_int après la vérification sans l’erreur de type incompatible.
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
- 35/100