benedict.core.traverse   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 30
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 9
eloc 23
dl 0
loc 30
rs 10
c 0
b 0
f 0

4 Functions

Rating   Name   Duplication   Size   Complexity  
A traverse() 0 4 2
A _traverse_list() 0 5 2
A _traverse_collection() 0 5 3
A _traverse_dict() 0 6 2
1
from benedict.utils import type_util
2
3
4
def _traverse_collection(d, callback):
5
    if type_util.is_dict(d):
6
        _traverse_dict(d, callback)
7
    elif type_util.is_list_or_tuple(d):
8
        _traverse_list(d, callback)
9
10
11
def _traverse_dict(d, callback):
12
    keys = list(d.keys())
13
    for key in keys:
14
        value = d.get(key, None)
15
        callback(d, key, value)
16
        _traverse_collection(value, callback)
17
18
19
def _traverse_list(ls, callback):
20
    items = list(enumerate(ls))
21
    for index, value in items:
22
        callback(ls, index, value)
23
        _traverse_collection(value, callback)
24
25
26
def traverse(d, callback):
27
    if not callable(callback):
28
        raise ValueError("callback argument must be a callable.")
29
    _traverse_collection(d, callback)
30