Skip to content

Use type(var) is T to Narrow Types #20041

@George-Ogden

Description

@George-Ogden

Feature

An example where this currently fails is:

t: type[str | int]
assert t is int # t == int also fails
reveal_type(t) # gives type[str] | type[int]

I would like the assertion on line 2 to narrow the type of t to type[int].
More generally, using is on a type should narrow that type.

Here is another use case:

def __eq__(self, obj: object) -> bool:
    return type(self) is type(obj) and self.value == obj.value

Currently, there is an issue that "object has no attribute value".
This can be avoided with

def __eq__(self, obj: object) -> bool:
    return type(self) is type(obj) and self.value == cast(Self, obj).value
    # or
    return isinstance(obj, type(self)) and isinstance(self, type(obj))and self.value == obj.value

But it would be great if the cast were avoided in this idiomatic check.

I don't know enough about Mypy's implementation to know how this would fit in, but I expect that isinstance and issubclass checks could be extended.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions