dol.explicit

utils to make stores based on a the input data itself

class dol.explicit.ExplicitKeymapReader(store, key_of_id=None, id_of_key=None)[source]

Wrap a store (instance) so that it gets it’s keys from an explicit iterable of keys.

>>> s = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> id_of_key = {'A': 'a', 'C': 'c'}
>>> ss = ExplicitKeymapReader(s, id_of_key=id_of_key)
>>> list(ss)
['A', 'C']
>>> ss['C']  # will look up 'C', find 'c', and call the store on that.
3
class dol.explicit.ExplicitKeys(key_collection: Collection)[source]

dol.base.Keys implementation that gets it’s keys explicitly from a collection given at initialization time. The key_collection must be a collections.abc.Collection (such as list, tuple, set, etc.)

>>> keys = ExplicitKeys(key_collection=['foo', 'bar', 'alice'])
>>> 'foo' in keys
True
>>> 'not there' in keys
False
>>> list(keys)
['foo', 'bar', 'alice']
class dol.explicit.ExplicitKeysSource(key_collection: Collection, _obj_of_key: Callable)[source]

An object source that uses an explicit keys collection and a specified function to read contents for a key.

>>> s = ExplicitKeysSource([1, 2, 3], str)
>>> list(s)
[1, 2, 3]
>>> list(s.values())
['1', '2', '3']

Main functionality equivalent to recipe:

>>> def explicit_keys_source(key_collection, _obj_of_key):
...     from dol.trans import wrap_kvs
...     return wrap_kvs({k: k for k in key_collection}, obj_of_data=_obj_of_key)
>>> s = explicit_keys_source([1, 2, 3], str)
>>> list(s)
[1, 2, 3]
>>> list(s.values())
['1', '2', '3']
class dol.explicit.ExplicitKeysStore(store, key_collection)[source]

Wrap a store (instance) so that it gets it’s keys from an explicit iterable of keys.

>>> s = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> list(s)
['a', 'b', 'c', 'd']
>>> ss = ExplicitKeysStore(s, ['d', 'a'])
>>> len(ss)
2
>>> list(ss)
['d', 'a']
>>> list(ss.values())
[4, 1]
>>> ss.head()
('d', 4)
class dol.explicit.KeysReader(src: ~dol.explicit.Source, key_collection: ~typing.Collection, getter: ~typing.Callable[[~dol.explicit.Source, KT], VT], *, key_error_msg: ~typing.Callable[[~dol.explicit.Source, KT], str] = <built-in method format of str object>)[source]

Mapping defined by keys with a getter function that gets values from keys.

KeysReader is particularly useful in cases where you want to have a mapping that lazy-load values for keys from an explicit collection.

Keywords: Lazy-evaluation, Mapping

Parameters:
  • src – The source where values will be extracted from.

  • key_collection – A collection of keys that will be used to extract values from src.

  • getter – A function that takes a source and a key, and returns the value for that key.

  • key_error_msg – A function that takes a source and a key, and returns an error message.

Example:

>>> src = {'apple': 'pie', 'banana': 'split', 'carrot': 'cake'}
>>> key_collection = ['carrot', 'apple']
>>> getter = lambda src, key: src[key]
>>> key_reader = KeysReader(src, key_collection, getter)

Note that the only the keys mentioned by key_collection will be iterated through, and in the order they are mentioned in key_collection.

>>> list(key_reader)
['carrot', 'apple']
>>> key_reader['apple']
'pie'
>>> key_reader['banana']  
Traceback (most recent call last):
...
KeyError: "Key 'banana' was not found....key_collection attribute)"

Let’s take the same src and key_collection, but with a different getter and key_error_msg:

Note that a key_error_msg must be a function that takes a src and a key, in that order and with those argument names. Say you wanted to not use the src in your message. You would still have to write a function that takes src as the first argument.

>>> key_error_msg = lambda src, key: f"Key {key} was not found"  # no source information
>>> getter = lambda src, key: f"Value for {key} in {src}: {src[key]}"
>>> key_reader = KeysReader(src, key_collection, getter, key_error_msg=key_error_msg)
>>> list(key_reader)
['carrot', 'apple']
>>> key_reader['apple']
"Value for apple in {'apple': 'pie', 'banana': 'split', 'carrot': 'cake'}: pie"
>>> key_reader['banana']  
Traceback (most recent call last):
...
KeyError: "Key banana was not found"