Moved recursively_apply into utilities
This commit is contained in:
parent
354524de64
commit
e213647217
1 changed files with 24 additions and 0 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
import copy
|
import copy
|
||||||
import operator
|
import operator
|
||||||
|
from collections import abc
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
|
@ -61,3 +62,26 @@ def entry_by_id(entry_id: str, object_list: list):
|
||||||
if o.id == entry_id:
|
if o.id == entry_id:
|
||||||
found = o
|
found = o
|
||||||
return found
|
return found
|
||||||
|
|
||||||
|
|
||||||
|
def recursively_apply(data, func):
|
||||||
|
"""
|
||||||
|
Recursively apply a function to a dictionary, list, array, or tuple
|
||||||
|
|
||||||
|
Args:
|
||||||
|
data: Input iterable data
|
||||||
|
func: Function to apply to all non-iterable values
|
||||||
|
"""
|
||||||
|
# If the object is a dictionary
|
||||||
|
if isinstance(data, abc.Mapping):
|
||||||
|
return {key: recursively_apply(val, func) for key, val in data.items()}
|
||||||
|
# If the object is iterable but NOT a dictionary or a string
|
||||||
|
elif (
|
||||||
|
isinstance(data, abc.Iterable)
|
||||||
|
and not isinstance(data, abc.Mapping)
|
||||||
|
and not isinstance(data, str)
|
||||||
|
):
|
||||||
|
return [recursively_apply(x, func) for x in data]
|
||||||
|
# if the object is neither a map nor iterable
|
||||||
|
else:
|
||||||
|
return func(data)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue