Skip to content

Commit

Permalink
Remove TypeType exception for abstract instantiation
Browse files Browse the repository at this point in the history
If A is abstract, it's weird to me that we have a difference in the
following two calls:
```
from abc import abstractmethod, ABCMeta
class A(metaclass=ABCMeta):
    @AbstractMethod
    def __init__(self, a: int) -> None:
        pass

def test_a(A_t: type[A]) -> None:
    A_t(1)
    A(1)
```

Mypy tries to then enforce soundness by preventing you from passing `A`
to a parameter of `type[A]`. But this is very unpopular, since there
are legitimate uses of `A` that have nothing to do with instantiation.
See python#4717

As mentioned in
https://discuss.python.org/t/compatibility-of-protocol-class-object-with-type-t-and-type-any/48442/2
I think we should switch to disallowing instantiation of `type[Proto]` and
`type[Abstract]`.

This also makes tackling `__init__` unsoundness more tractable. If
people want unsound `__init__`, they can use `Callable[..., P]`.
  • Loading branch information
hauntsaninja committed Nov 3, 2024
1 parent 1f200dd commit 719f89e
Showing 1 changed file with 0 additions and 4 deletions.
4 changes: 0 additions & 4 deletions mypy/checkexpr.py
Original file line number Diff line number Diff line change
Expand Up @@ -1671,8 +1671,6 @@ def check_callable_call(
if (
callee.is_type_obj()
and callee.type_object().is_protocol
# Exception for Type[...]
and not callee.from_type_type
):
self.chk.fail(
message_registry.CANNOT_INSTANTIATE_PROTOCOL.format(callee.type_object().name),
Expand All @@ -1681,8 +1679,6 @@ def check_callable_call(
elif (
callee.is_type_obj()
and callee.type_object().is_abstract
# Exception for Type[...]
and not callee.from_type_type
and not callee.type_object().fallback_to_any
):
type = callee.type_object()
Expand Down

0 comments on commit 719f89e

Please sign in to comment.