diff options
author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2023-02-12 18:30:23 +0000 |
---|---|---|
committer | Viacheslav Hletenko <v.gletenko@vyos.io> | 2023-02-12 18:30:23 +0000 |
commit | a55bbcc8ec25a3616b7f6396ee14168a707f18eb (patch) | |
tree | 99703870bbcb6ef37902c5905a7f52f17891129e /python/vyos | |
parent | c99c1127d3bc49b67e472e03fcd7f9930407f20d (diff) | |
download | vyos-1x-a55bbcc8ec25a3616b7f6396ee14168a707f18eb.tar.gz vyos-1x-a55bbcc8ec25a3616b7f6396ee14168a707f18eb.zip |
T4999: Backport vyos util dict_search_recursive
Backport "dict_search_recursive" from vyos.util 1.4 to 1.3
data = {
'interfaces': {'dummy': {'dum0': {'address': ['192.0.2.17/29']}},
'ethernet': {'eth0': {'address': ['2001:db8::1/64', '192.0.2.1/29'],
'description': 'Test123',
'duplex': 'auto',
'hw_id': '00:00:00:00:00:01',
'speed': 'auto'},
'eth1': {'address': ['192.0.2.9/29'],
'description': 'Test456',
'duplex': 'auto',
'hw_id': '00:00:00:00:00:02',
'speed': 'auto'}}}
}
dict_search_recursive(data, 'hw_id') will yield both '00:00:00:00:00:01' and
'00:00:00:00:00:02' as generator object.
Diffstat (limited to 'python/vyos')
-rw-r--r-- | python/vyos/util.py | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/python/vyos/util.py b/python/vyos/util.py index 5c6409341..32a5ae116 100644 --- a/python/vyos/util.py +++ b/python/vyos/util.py @@ -1,4 +1,4 @@ -# Copyright 2020-2022 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2020-2023 VyOS maintainers and contributors <maintainers@vyos.io> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -720,6 +720,26 @@ def dict_search(path, dict_object): c = c.get(p, {}) return c.get(parts[-1], None) +def dict_search_recursive(dict_object, key, path=[]): + """ Traverse a dictionary recurisvely and return the value of the key + we are looking for. + Thankfully copied from https://stackoverflow.com/a/19871956 + Modified to yield optional path to found keys + """ + if isinstance(dict_object, list): + for i in dict_object: + new_path = path + [i] + for x in dict_search_recursive(i, key, new_path): + yield x + elif isinstance(dict_object, dict): + if key in dict_object: + new_path = path + [key] + yield dict_object[key], new_path + for k, j in dict_object.items(): + new_path = path + [k] + for x in dict_search_recursive(j, key, new_path): + yield x + def convert_data(data): """Convert multiple types of data to types usable in CLI |