-
-
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