Answer a question

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?

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.

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐