Source code for wolframclient.utils.datastructures

from __future__ import absolute_import, print_function, unicode_literals

from collections import OrderedDict


[docs] class Association(OrderedDict): """A :class:`~collections.OrderedDict` that serializes to an Association""" def __repr__(self): return dict.__repr__(self)
def _fail(self, *args, **opts): raise TypeError("{} does not support item assignment".format(self.__class__.__name__))
[docs] class immutabledict(dict): """ hashable dict implementation, suitable for use as a key into other dicts. >>> h1 = immutabledict({"apples": 1, "bananas":2}) >>> h2 = immutabledict({"bananas": 3, "mangoes": 5}) >>> h1+h2 immutabledict(apples=1, bananas=3, mangoes=5) >>> d1 = {} >>> d1[h1] = "salad" >>> d1[h1] 'salad' >>> d1[h2] Traceback (most recent call last): ... KeyError: immutabledict(bananas=3, mangoes=5) based on answers from http://stackoverflow.com/questions/1151658/python-hashable-dicts """ def __hash__(self): return hash(tuple(self.items())) __setitem__ = _fail __delitem__ = _fail clear = _fail pop = _fail popitem = _fail setdefault = _fail update = _fail def __add__(self, right): result = hashdict(self) dict.update(result, right) return result
[docs] class Settings(dict): """ Dictionary subclass enabling attribute lookup/assignment of keys/values. For example:: >>> m = Settings({'foo': 'bar'}) >>> m.foo 'bar' >>> m.foo = 'not bar' >>> m['foo'] 'not bar' ``Settings`` objects also provide ``.first()`` which acts like ``.get()`` but accepts multiple keys as arguments, and returns the value of the first hit, e.g.:: >>> m = Settings({'foo': 'bar', 'biz': 'baz'}) >>> m.first('wrong', 'incorrect', 'foo', 'biz') 'bar' """ def __getattr__(self, key): try: return self[key] except KeyError: # to conform with __getattr__ spec raise AttributeError(key) def __setattr__(self, key, value): self[key] = value