[ty] Improve the Display for generic type[] types (#19667)

This commit is contained in:
Alex Waygood 2025-07-31 19:45:01 +01:00 committed by GitHub
parent a3f28baab4
commit 2ab1502e51
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 3 deletions

View file

@ -151,6 +151,28 @@ class Foo(type[int]): ...
reveal_type(Foo.__mro__) # revealed: tuple[<class 'Foo'>, @Todo(GenericAlias instance), <class 'object'>]
```
## Display of generic `type[]` types
```toml
[environment]
python-version = "3.12"
```
```py
from typing import Generic, TypeVar
class Foo[T]: ...
S = TypeVar("S")
class Bar(Generic[S]): ...
def _(x: Foo[int], y: Bar[str], z: list[bytes]):
reveal_type(type(x)) # revealed: type[Foo[int]]
reveal_type(type(y)) # revealed: type[Bar[str]]
reveal_type(type(z)) # revealed: type[list[bytes]]
```
## `@final` classes
`type[]` types are eagerly converted to class-literal types if a class decorated with `@final` is

View file

@ -109,9 +109,12 @@ impl Display for DisplayRepresentation<'_> {
}
Type::GenericAlias(generic) => write!(f, "<class '{}'>", generic.display(self.db)),
Type::SubclassOf(subclass_of_ty) => match subclass_of_ty.subclass_of() {
// Only show the bare class name here; ClassBase::display would render this as
// type[<class 'Foo'>] instead of type[Foo].
SubclassOfInner::Class(class) => write!(f, "type[{}]", class.name(self.db)),
SubclassOfInner::Class(ClassType::NonGeneric(class)) => {
write!(f, "type[{}]", class.name(self.db))
}
SubclassOfInner::Class(ClassType::Generic(alias)) => {
write!(f, "type[{}]", alias.display(self.db))
}
SubclassOfInner::Dynamic(dynamic) => write!(f, "type[{dynamic}]"),
},
Type::SpecialForm(special_form) => special_form.fmt(f),