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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions