dict literals inferred like immutable Mapping
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 38/100
Piste de recherche
Commencez par exécuter la reproduction fournie avec mypy 0.910 et comparez le type inféré du littéral de dict non annoté avec celui de la version explicitement annotée. Suivez le chemin d’inférence des littéraux de dict et vérifiez que l’affectation accepte l’union attendue sans affaiblir la sécurité des types ; l’issue est résolue lorsque la reproduction réussit.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug Report
dict literal behaves as though it is inferred to be (immutable) Mapping
To Reproduce
class OrmBase:
pass
class Orm1(OrmBase):
pass
class Orm1Prime(OrmBase):
pass
class Orm2(OrmBase):
pass
class Orm2Prime(OrmBase):
pass
def func(orm: Union[Orm1, Orm2]):
orm_mapper = {
Orm1: Orm1Prime,
Orm2: Orm2Prime,
}
mapped: Union[Type[Orm1Prime], Type[Orm2Prime]] = orm_mapper[orm.__class__]
# Incompatible types in assignment (expression has type "Type[OrmBase]",
# variable has type "Union[Type[Orm1Prime], Type[Orm2Prime]]") [E]
return mapped
Expected Behavior
dict is a MutableMapping, which is invariant with respect to value types. The Union on mapped should be acceptable here. (Pyright has no issue with this.)
Actual Behavior
The Union is rejected, apparently because the parent class is expected (see the error message above).
Adding a plain dict annotation resolves the error:
orm_mapper: dict = { ...
I believe this resolves the error by telling Mypy that this is a MutableMapping with invariant VT and not a Mapping with covariant VT_co. typing's definitions of both
Your Environment
- Mypy version used: 0.910
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files):
[mypy]
plugins = sqlalchemy.ext.mypy.plugin
ignore_missing_imports = True
[mypy-sqlalchemy.*]
- Python version used: 3.9.6
- Operating system and version: Fedora 34 (Workstation)
- 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
-
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
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100