Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'ABCMeta' object is not subscriptable when trying to annotate a hash variable

The following dataclass:

from abc import ABC
from collections.abc import Mapping
from dataclasses import dataclass, field

@dataclass(eq=True, order=True, frozen=True)
class Expression(Node, ABC):
    def node(self):
        raise NotImplementedError

is used as a base class for:

@dataclass(eq=True, frozen=True)
class HashLiteral(Expression):
    pairs: Mapping[Expression, Expression]
    ...

Node is defined as:

@dataclass(eq=True, frozen=True)
class Node:
    def __str__(self) -> str:
        raise NotImplementedError

When trying to use the HashLiteral class I get the error:

pairs: Mapping[Expression, Expression]
TypeError: 'ABCMeta' object is not subscriptable

What is wrong with my annotation of pairs above?

like image 266
dearn44 Avatar asked Jan 28 '20 19:01

dearn44


1 Answers

You should use typing.Mapping instead of collections.abc.Mapping. typing contains many generic versions of various types, which are designed to be used in type hints. According to the mypy documentation, there are some differences between the typing classes and the collections.abc classes, but they're unclear on exactly what those differences are.

like image 160
Patrick Haugh Avatar answered Nov 12 '22 22:11

Patrick Haugh