Skip to content

Detect Any used as a metaclass #13599

@sobolevn

Description

@sobolevn

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:

mypy/mypy/semanal.py

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:

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions