You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.1 KiB

  1. from abc import abstractmethod
  2. from collections.abc import MutableMapping
  3. class DefaultMapping(MutableMapping):
  4. __slots__ = ()
  5. @abstractmethod
  6. def __contains__(self, key): # pragma: nocover
  7. return False
  8. @abstractmethod
  9. def __getitem__(self, key): # pragma: nocover
  10. if hasattr(self.__class__, '__missing__'):
  11. return self.__class__.__missing__(self, key)
  12. else:
  13. raise KeyError(key)
  14. def get(self, key, default=None):
  15. if key in self:
  16. return self[key]
  17. else:
  18. return default
  19. __marker = object()
  20. def pop(self, key, default=__marker):
  21. if key in self:
  22. value = self[key]
  23. del self[key]
  24. elif default is self.__marker:
  25. raise KeyError(key)
  26. else:
  27. value = default
  28. return value
  29. def setdefault(self, key, default=None):
  30. if key in self:
  31. value = self[key]
  32. else:
  33. self[key] = value = default
  34. return value
  35. DefaultMapping.register(dict)