Source code for pureyaml._compat.singledispatch_helpers

#!/usr/bin/env python
# coding=utf-8

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from abc import ABCMeta
from collections import MutableMapping

from future.backports.misc import get_ident
from future.moves.collections import UserDict

# noinspection PyIncorrectDocstring
from future.utils import PYPY


# noinspection PyIncorrectDocstring
[docs]def recursive_repr(fillvalue='...'): """Decorator to make a repr function return fillvalue for a recursive call""" def decorating_function(user_function): repr_running = set() def wrapper(self): key = id(self), get_ident() if key in repr_running: return fillvalue repr_running.add(key) try: result = user_function(self) finally: repr_running.discard(key) return result # Can't use functools.wraps() here because of bootstrap issues wrapper.__module__ = getattr(user_function, '__module__') wrapper.__doc__ = getattr(user_function, '__doc__') wrapper.__name__ = getattr(user_function, '__name__') wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) return wrapper return decorating_function
[docs]class ChainMap(MutableMapping): """ A ChainMap groups multiple dicts (or other mappings) together to create a single, updateable view. The underlying mappings are stored in a list. That list is public and can accessed or updated using the *maps* attribute. There is no other state. Lookups search the underlying mappings successively until a key is found. In contrast, writes, updates, and deletions only operate on the first mapping. """
[docs] def __init__(self, *maps): """Initialize a ChainMap by setting *maps* to the given mappings. If no mappings are provided, a single empty dictionary is used. """ self.maps = list(maps) or [{}] # always at least one map
# noinspection PyMethodMayBeStatic
[docs] def __missing__(self, key): raise KeyError(key)
[docs] def __getitem__(self, key): for mapping in self.maps: try: return mapping[key] # can't use 'key in mapping' with defaultdict except KeyError: pass return self.__missing__(key) # support subclasses that define __missing__
[docs] def get(self, key, default=None): return self[key] if key in self else default
[docs] def __len__(self): return len(set().union(*self.maps)) # reuses stored hash values if possible
[docs] def __iter__(self): return iter(set().union(*self.maps))
[docs] def __contains__(self, key): return any(key in m for m in self.maps)
@recursive_repr()
[docs] def __repr__(self): return '{0.__class__.__name__}({1})'.format(self, ', '.join(map(repr, self.maps)))
# noinspection PyIncorrectDocstring @classmethod
[docs] def fromkeys(cls, iterable, *args): """Create a ChainMap with a single dict created from the iterable.""" return cls(dict.fromkeys(iterable, *args))
[docs] def copy(self): """New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]""" return self.__class__(self.maps[0].copy(), *self.maps[1:])
__copy__ = copy
[docs] def new_child(self): # like Django's Context.push() """New ChainMap with a new dict followed by all previous maps.""" return self.__class__({}, *self.maps)
@property def parents(self): # like Django's Context.pop() """New ChainMap from maps[1:].""" return self.__class__(*self.maps[1:])
[docs] def __setitem__(self, key, value): self.maps[0][key] = value
[docs] def __delitem__(self, key): try: del self.maps[0][key] except KeyError: raise KeyError('Key not found in the first mapping: {!r}'.format(key))
[docs] def popitem(self): """Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.""" try: return self.maps[0].popitem() except KeyError: raise KeyError('No keys found in the first mapping.')
# noinspection PyIncorrectDocstring
[docs] def pop(self, key, *args): """Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].""" try: return self.maps[0].pop(key, *args) except KeyError: raise KeyError('Key not found in the first mapping: {!r}'.format(key))
[docs] def clear(self): """Clear maps[0], leaving maps[1:] intact.""" self.maps[0].clear()
[docs]class MappingProxyType(UserDict):
[docs] def __init__(self, data): UserDict.__init__(self) self.data = data
[docs]def get_cache_token():
# noinspection PyProtectedMember return ABCMeta._abc_invalidation_counter
[docs]class Support(object):
[docs] def dummy(self): pass
[docs] def cpython_only(self, func): return self.dummy if PYPY else func