dol.dig¶
Layers introspection
-
dol.dig.
trace_getitem
(store, k, layer_attrs=('store'))[source]¶ A generator of layered steps to inspect a store.
- Parameters
store – An instance that has the base.Store interface
k – A key
layer_attrs – The attribute names that should be checked to get the next layer.
- Returns
A generator of (layer, method, value)
We start with a small dict:
>>> d = {'a.num': '1000', 'b.num': '2000'}
Now let’s add layers to it. For example, with wrap_kvs:
>>> from dol.trans import wrap_kvs
Say that we want the interface to not see the
'.num'
strings, and deal with numerical values, not strings.>>> s = wrap_kvs(d, ... key_of_id=lambda x: x[:-len('.num')], ... id_of_key=lambda x: x + '.num', ... obj_of_data=lambda x: int(x), ... data_of_obj=lambda x: str(x) ... ) >>>
Oh, and we want the interface to display upper case keys.
>>> ss = wrap_kvs(s, ... key_of_id=lambda x: x.upper(), ... id_of_key=lambda x: x.lower(), ... )
And we want the numerical unit to be the kilo (that’s 1000):
>>> sss = wrap_kvs(ss, ... obj_of_data=lambda x: x / 1000, ... data_of_obj=lambda x: x * 1000 ... ) >>> >>> dict(sss.items()) {'A': 1.0, 'B': 2.0}
Well, if we had bugs, we’d like to inspect the various layers, and how they transform the data.
# Here's how to do that: # >>> for layer, method, value in trace_getitem(sss, 'A'): # ... print(layer, method, value) # ... # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # NameError: name 'trace_getitem' is not defined
>>> from dol.dig import trace_getitem >>> >>> for layer, method, value in trace_getitem(sss, 'A'): ... print(layer, method, value) ... {'a.num': '1000', 'b.num': '2000'} _id_of_key A {'a.num': '1000', 'b.num': '2000'} _id_of_key A {'a.num': '1000', 'b.num': '2000'} _id_of_key a {'a.num': '1000', 'b.num': '2000'} _id_of_key a {'a.num': '1000', 'b.num': '2000'} _id_of_key a.num {'a.num': '1000', 'b.num': '2000'} _id_of_key a.num {'a.num': '1000', 'b.num': '2000'} __getitem__ 1000 {'a.num': '1000', 'b.num': '2000'} _obj_of_data 1000 {'a.num': '1000', 'b.num': '2000'} _obj_of_data 1000 {'a.num': '1000', 'b.num': '2000'} _obj_of_data 1000 {'a.num': '1000', 'b.num': '2000'} _obj_of_data 1000 {'a.num': '1000', 'b.num': '2000'} _obj_of_data 1000 {'a.num': '1000', 'b.num': '2000'} _obj_of_data 1.0