Added unflatten method.
This commit is contained in:
parent
77a3b94f5b
commit
5f605139e2
|
@ -157,6 +157,13 @@ class benedict(IODict, KeypathDict, ParseDict):
|
|||
"""
|
||||
dict_util.traverse(self, callback)
|
||||
|
||||
def unflatten(self, separator='_'):
|
||||
"""
|
||||
Return a new unflattened dict using the given separator
|
||||
to split dict keys to nested keypaths.
|
||||
"""
|
||||
return dict_util.unflatten(self, separator)
|
||||
|
||||
def unique(self):
|
||||
"""
|
||||
Remove duplicated values from the current dict instance.
|
||||
|
|
|
@ -214,6 +214,22 @@ def traverse(d, callback):
|
|||
traverse(value, callback)
|
||||
|
||||
|
||||
def unflatten(d, separator='_'):
|
||||
new_dict = d.copy()
|
||||
new_dict.clear()
|
||||
new_dict_cursor = new_dict
|
||||
keys = list(d.keys())
|
||||
for key in keys:
|
||||
value = d.get(key, None)
|
||||
new_value = unflatten(value, separator=separator) if isinstance(
|
||||
value, dict) else value
|
||||
new_keys = key.split(separator) if separator in key else [key]
|
||||
new_parent, new_key, _ = resolve(
|
||||
new_dict, new_keys, create_intermediates=True)
|
||||
new_parent[new_key] = new_value
|
||||
return new_dict
|
||||
|
||||
|
||||
def unique(d):
|
||||
values = []
|
||||
keys = list(d.keys())
|
||||
|
|
|
@ -1542,6 +1542,30 @@ b:
|
|||
}
|
||||
self.assertEqual(b, r)
|
||||
|
||||
def test_unflatten(self):
|
||||
d = {
|
||||
'device_os': 'Windows',
|
||||
'device_lang': 'en-US',
|
||||
'device_code': 43,
|
||||
'browser_name': 'Chrome',
|
||||
'browser_layout': 'Webkit',
|
||||
}
|
||||
b = benedict(d)
|
||||
u = b.unflatten()
|
||||
r = {
|
||||
'device': {
|
||||
'os': 'Windows',
|
||||
'lang': 'en-US',
|
||||
'code': 43,
|
||||
},
|
||||
'browser': {
|
||||
'name': 'Chrome',
|
||||
'layout': 'Webkit',
|
||||
},
|
||||
}
|
||||
self.assertEqual(u, r)
|
||||
self.assertEqual(u.flatten(), b)
|
||||
|
||||
def test_unique(self):
|
||||
d = {
|
||||
'a': {
|
||||
|
|
Loading…
Reference in New Issue