Skip to content

Respecting return type of __new__ does not extend to derived classes #8330

Description

@ikonst

Following #7188, we can now have:

fromtypingimportoverloadfromtyping_extensionsimportLiteralclassCat:
@overloaddef__new__(cls, name: Literal['Tabby']) ->'Tabby': ...
@overloaddef__new__(cls, name: Literal['Kitty']) ->'Kitty': ...
def__new__(cls, name: str) ->'Cat': ...
classKitty(Cat):
passclassTabby(Cat):
passreveal_type(Cat('Kitty'))
reveal_type(Cat('Tabby'))

result in:

Revealed type is 'test.Kitty'
Revealed type is 'test.Tabby'

(Meant as a trivial example.)

However, this doesn't extend to derived classes:

reveal_type(Tabby('Kitty'))
reveal_type(Tabby('Tabby'))

would result in:

Revealed type is 'test.Tabby'
Revealed type is 'test.Tabby'

I'm using mypy 0.761.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions