dict literals inferred like immutable Mapping

Ouverte
#11,090 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
38/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
python
Domaine
tooling

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 topic-join-v-union

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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de python/mypy

Toutes les issues de python/mypy

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.