Set and Dict generalizing the type unnecessarily
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
Bug Report
See these two example functions:
def f(items: list[str] | list[int]) -> None:
items_as_set: set[str] | set[int] = set(items)
def g(key_to_count: dict[str, float] | dict[int, float]) -> None:
key_to_count_2: dict[str, float] | dict[int, float] = {k: v for k, v in key_to_count.items()}
Mypy 1.10.0 complains about the assignment in each of them:
test_mypy_dict.py:2: error: Incompatible types in assignment (expression has type "set[object]", variable has type "set[str] | set[int]") [assignment]
test_mypy_dict.py:5: error: Incompatible types in assignment (expression has type "dict[str | int, float]", variable has type "dict[str, float] | dict[int, float]") [assignment]
To Reproduce
Playground gist: https://mypy-play.net/?mypy=latest&python=3.12&gist=83bde5f3f11470e94b6a680158649641
Expected Behavior
The set() or dict() operation applied on a variable that is either a list[str] | list[int] is always either a set[str] or set[int]. The same applies to function g using a dict. Thus the functions should not raise a mypy error.
Workarounds
I tried two workarounds:
- Using a mixed type of
list[str | int]. However, I get the typelist[str] | list[int]by an external function, thus this is not compatible. - Using a generic. This is not working either.
See the playground gist: https://mypy-play.net/?mypy=latest&python=3.12&gist=264490179628a0a214a2e5bd947b8ccf
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 exécuter les deux reproductions Python de l’issue, y compris les exemples mypy-play liés, puis comparez les types inférés et les erreurs d’affectation pour set() et la dict comprehension. Suivez le chemin de vérification des types pour ces expressions de constructeur et de comprehension ; le travail est terminé lorsque les deux fonctions sont vérifiées sans erreur tout en préservant l’union de types de conteneurs homogènes.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers, devtools
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100