dol.explicit¶
Stores whose keys are given explicitly, with values fetched lazily from a source.
Main entry points:
KeysReader: a collection of keys plus agetter(src, key)ExplicitKeysSource: explicit keys plus a function reading the value for a keyExplicitKeysStore: wrap a store so that its keys come from an explicit iterableExplicitKeyMap: a key mapper given as explicit dicts>>> from dol.explicit import KeysReader >>> r = KeysReader({'apple': 'pie', 'banana': 'split'}, ['banana'], lambda src, k: src[k]) >>> list(r), r['banana'] (['banana'], 'split')
Classes
|
A key mapper given as explicit |
|
Wrap a store (instance) so that it gets it's keys from an explicit iterable of keys. |
|
dol.base.Keys implementation that gets it's keys explicitly from a collection given at initialization time. |
|
An object source that uses an explicit keys collection and a specified function to read contents for a key. |
|
Wrap a store (instance) so that it gets it's keys from an explicit iterable of keys. |
|
Mapping defined by keys with a getter function that gets values from keys. |
|
- class dol.explicit.ExplicitKeyMap(*, key_of_id=None, id_of_key=None)[source]¶
Bases:
objectA key mapper given as explicit
key_of_id/id_of_keydicts (one is enough; the other is derived, and both are checked to be inverse of each other). Provides the_key_of_id/_id_of_keymethods thatkv_wraplooks for.
- class dol.explicit.ExplicitKeymapReader(store, key_of_id=None, id_of_key=None)[source]¶
Bases:
ExplicitKeys,StoreWrap 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)[source]¶
Bases:
Collectiondol.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, _obj_of_key)[source]¶
Bases:
ExplicitKeys,ObjReader,KvReaderAn 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]¶
Bases:
ExplicitKeys,StoreWrap 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, key_collection, getter, *, key_error_msg=<built-in method format of str object>)[source]¶
Bases:
MappingMapping defined by keys with a getter function that gets values from keys.
KeysReaderis 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 (
TypeVar(Source)) – The source where values will be extracted from.key_collection (
Collection[TypeVar(KT)]) – A collection of keys that will be used to extract values fromsrc.getter (
Callable[[TypeVar(Source),TypeVar(KT)],TypeVar(VT)]) – A function that takes a source and a key, and returns the value for that key.key_error_msg (
Callable[[TypeVar(Source),TypeVar(KT)],str]) – 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_collectionwill be iterated through, and in the order they are mentioned inkey_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
srcandkey_collection, but with a different getter and key_error_msg:Note that a key_error_msg must be a function that takes a
srcand akey, in that order and with those argument names. Say you wanted to not use thesrcin your message. You would still have to write a function that takessrcas 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"