@@ -21,16 +21,16 @@ reveal_type(type.__class__) # revealed: Literal[type]
2121## Basic
2222
2323``` py
24- class A (type ): ...
25- class B (metaclass = A ): ...
24+ class M (type ): ...
25+ class B (metaclass = M ): ...
2626
27- reveal_type(B.__class__ ) # revealed: Literal[A ]
27+ reveal_type(B.__class__ ) # revealed: Literal[M ]
2828```
2929
3030## Invalid metaclass
3131
32- If a class is a subclass of a class with a custom metaclass, then the subclass will also have that
33- metaclass.
32+ A class which doesn't inherit ` type ` (and/or doesn't implement a custom ` __new__ ` accepting the same
33+ arguments as ` type.__new__ ` ) isn't a valid metaclass.
3434
3535``` py
3636class M : ...
@@ -139,13 +139,14 @@ from nonexistent_module import UnknownClass # error: [unresolved-import]
139139
140140class C (UnknownClass ): ...
141141
142+ # TODO : should be `type[type] & Unknown`
142143reveal_type(C.__class__ ) # revealed: Literal[type]
143144
144145class M (type ): ...
145146class A (metaclass = M ): ...
146147class B (A , UnknownClass ): ...
147148
148- # TODO : This should resolve to `type[M] | Unknown` instead
149+ # TODO : should be `type[M] & Unknown`
149150reveal_type(B.__class__ ) # revealed: Literal[M]
150151```
151152
@@ -161,12 +162,16 @@ reveal_type(B.__class__) # revealed: Literal[M]
161162
162163## Non-class
163164
164- When a class has an explicit ` metaclass ` that is not a class, the value should be returned as is.
165+ When a class has an explicit ` metaclass ` that is not a class, but is a callable that accepts
166+ ` type.__new__ ` arguments, we should return the meta type of its return type.
165167
166168``` py
167- class A (metaclass = 1 ): ...
169+ def f (* args , ** kwargs ) -> int : ...
170+
171+ class A (metaclass = f ): ...
168172
169- reveal_type(A.__class__ ) # revealed: Literal[1]
173+ # TODO should be `type[int]`
174+ reveal_type(A.__class__ ) # revealed: @Todo
170175```
171176
172177## Cyclic
0 commit comments