-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Closed
Labels
Description
Right now there's an inconsistency in how base classes / metaclasses behave when working with Any.
Example:
from typing import Any
MyAny: Any = type('MyAny', (type,), {'a': 1})
class Subclass(MyAny):
pass
class WithMeta(metaclass=MyAny):
pass
reveal_type(Subclass.a) # N: Revealed type is "Any"
reveal_type(WithMeta.a) # E: "Type[WithMeta]" has no attribute "a" \
# N: Revealed type is "Any"Both Subclass.a and WithMeta.a return 1 in runtime. But, for some reason metaclass=Any is not recognised.
It even has an existing TODO item:
Lines 2076 to 2082 in dfbaff7
| if isinstance(sym.node, Var) and isinstance(get_proper_type(sym.node.type), AnyType): | |
| # 'Any' metaclass -- just ignore it. | |
| # | |
| # TODO: A better approach would be to record this information | |
| # and assume that the type object supports arbitrary | |
| # attributes, similar to an 'Any' base class. | |
| return None, False |
But, it was never implemented. I would love to fix it.
Related:
AlexWaygood