MyPy treats initialization of a variable as an assignment for variance checks for complex dictionary.
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 problem is that when initializing a variable from a dictionary expression it treats the type as invariant, but in the case of initialialization, it is covariant.
Example:
CODES = {
"a": "b",
"c": "d",
"e": "f",
}
# MyPy rejects this
PATTERNS: dict[str, tuple[str | None, str | None]] = {
"1" + k: ((v + "1" if v else None), "x")
for (k, v) in CODES.items()
} | {
"2" + k: ((v + "2" if v else None), "x")
for (k, v) in CODES.items()
}
# But is OK with this:
X: str | None = "x"
PATTERNS2: dict[str, tuple[str | None, str | None]] = {
"1" + k: ((v + "1" if v else None), X)
for (k, v) in CODES.items()
} | {
"1" + k: ((v + "1" if v else None), X)
for (k, v) in CODES.items()
}
Both patterns should be OK.
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 l’exemple MyPy fourni et comparez les diagnostics pour PATTERNS et PATTERNS2. Suivez le chemin de vérification des types pour les expressions de dictionnaire combinées à l’initialisation annotée et aux vérifications de variance. Ajoutez un test de régression couvrant l’exemple ; le travail est terminé lorsque les deux patterns sont acceptés sans affaiblir les vérifications de variance sans rapport.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 38/100