1import abc
2import sys
3import types
4from collections.abc import Mapping, MutableMapping
5
6
7class _TypingMeta(abc.ABCMeta):
8 # A fake metaclass to satisfy typing deps in runtime
9 # basically MultiMapping[str] and other generic-like type instantiations
10 # are emulated.
11 # Note: real type hints are provided by __init__.pyi stub file
12 if sys.version_info >= (3, 9):
13
14 def __getitem__(self, key):
15 return types.GenericAlias(self, key)
16
17 else:
18
19 def __getitem__(self, key):
20 return self
21
22
23class MultiMapping(Mapping, metaclass=_TypingMeta):
24 @abc.abstractmethod
25 def getall(self, key, default=None):
26 raise KeyError
27
28 @abc.abstractmethod
29 def getone(self, key, default=None):
30 raise KeyError
31
32
33class MutableMultiMapping(MultiMapping, MutableMapping):
34 @abc.abstractmethod
35 def add(self, key, value):
36 raise NotImplementedError
37
38 @abc.abstractmethod
39 def extend(self, *args, **kwargs):
40 raise NotImplementedError
41
42 @abc.abstractmethod
43 def popone(self, key, default=None):
44 raise KeyError
45
46 @abc.abstractmethod
47 def popall(self, key, default=None):
48 raise KeyError