Skip to content

Dict arguments that contain a subclass are not handled by Mypy correctly #9738

@VasLem

Description

@VasLem

I have the following example piece of code

from typing import Any, Dict


class P:
    pass

class C(P):
    pass

class A:
    def __init__(self, x: Dict[P, Any]):
        pass

class B(A):
    def __init__(self, x: Dict[C, Any]):
        super().__init__(x)

When running mypy on it, this warning appears:

Argument 1 to "init" of "A" has incompatible type "Dict[C, Any]"; expected "Dict[P, Any]"

Why is this happening? If I do the same, but without using Dict[], ie:

class P:
    pass

class C(P):
    pass

class A:
    def __init__(self, x: P):
        pass

class B(A):
    def __init__(self, x: C):
        super().__init__(x)

I get no complains. I tried using Mapping[] instead of Dict[] but the same warning occurs.

This happens a lot in the code, as I am subclassing from a Library class, I cannot use cast every time, it's counter productive

Environment

  • Mypy version used: 0.790
  • Python version used: 3.8.5
  • Operating system and version: Ubuntu 20.04

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrong

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions