[ty] Allow classes to inherit from type[Any] or type[Unknown] (#18060)

This commit is contained in:
Alex Waygood 2025-05-12 20:30:21 -04:00 committed by GitHub
parent 41fa082414
commit 7e9b0df18a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 68 additions and 48 deletions

View file

@ -177,6 +177,23 @@ if not isinstance(DoesNotExist, type):
reveal_type(Foo.__mro__) # revealed: tuple[<class 'Foo'>, Unknown, <class 'object'>]
```
## Inheritance from `type[Any]` and `type[Unknown]`
Inheritance from `type[Any]` and `type[Unknown]` is also permitted, in keeping with the gradual
guarantee:
```py
from typing import Any
from ty_extensions import Unknown, Intersection
def f(x: type[Any], y: Intersection[Unknown, type[Any]]):
class Foo(x): ...
reveal_type(Foo.__mro__) # revealed: tuple[<class 'Foo'>, Any, <class 'object'>]
class Bar(y): ...
reveal_type(Bar.__mro__) # revealed: tuple[<class 'Bar'>, Unknown, <class 'object'>]
```
## `__bases__` lists that cause errors at runtime
If the class's `__bases__` cause an exception to be raised at runtime and therefore the class

View file

@ -140,6 +140,43 @@ info[revealed-type]: Revealed type
```
```
error[duplicate-base]: Duplicate base class `Eggs`
--> src/mdtest_snippet.py:16:7
|
14 | # error: [duplicate-base] "Duplicate base class `Spam`"
15 | # error: [duplicate-base] "Duplicate base class `Eggs`"
16 | class Ham(
| _______^
17 | | Spam,
18 | | Eggs,
19 | | Bar,
20 | | Baz,
21 | | Spam,
22 | | Eggs,
23 | | ): ...
| |_^
24 |
25 | # fmt: on
|
info: The definition of class `Ham` will raise `TypeError` at runtime
--> src/mdtest_snippet.py:18:5
|
16 | class Ham(
17 | Spam,
18 | Eggs,
| ---- Class `Eggs` first included in bases list here
19 | Bar,
20 | Baz,
21 | Spam,
22 | Eggs,
| ^^^^ Class `Eggs` later repeated here
23 | ): ...
|
info: rule `duplicate-base` is enabled by default
```
```
error[duplicate-base]: Duplicate base class `Spam`
--> src/mdtest_snippet.py:16:7
@ -178,43 +215,6 @@ info: rule `duplicate-base` is enabled by default
```
```
error[duplicate-base]: Duplicate base class `Eggs`
--> src/mdtest_snippet.py:16:7
|
14 | # error: [duplicate-base] "Duplicate base class `Spam`"
15 | # error: [duplicate-base] "Duplicate base class `Eggs`"
16 | class Ham(
| _______^
17 | | Spam,
18 | | Eggs,
19 | | Bar,
20 | | Baz,
21 | | Spam,
22 | | Eggs,
23 | | ): ...
| |_^
24 |
25 | # fmt: on
|
info: The definition of class `Ham` will raise `TypeError` at runtime
--> src/mdtest_snippet.py:18:5
|
16 | class Ham(
17 | Spam,
18 | Eggs,
| ---- Class `Eggs` first included in bases list here
19 | Bar,
20 | Baz,
21 | Spam,
22 | Eggs,
| ^^^^ Class `Eggs` later repeated here
23 | ): ...
|
info: rule `duplicate-base` is enabled by default
```
```
info[revealed-type]: Revealed type
--> src/mdtest_snippet.py:27:13