dict_utils
Adapted from the Griptape AI Framework documentation.
Add a key in a dictionary recursively.
Parameters
Name | Type | Description | Default |
---|---|---|---|
d | Any | The dictionary to add the key to. | required |
key | str | The key to add. | required |
value | Any | The value to add. | required |
criteria | Optional[Callable[[dict], bool]] | An optional function to determine if the key should be added. | None |
Source Code in griptape/utils/dict_utils.py
def add_key_in_dict_recursively( d: Any, key: str, value: Any, criteria: Optional[Callable[[dict], bool]] = None ) -> dict: """Add a key in a dictionary recursively. Args: d: The dictionary to add the key to. key: The key to add. value: The value to add. criteria: An optional function to determine if the key should be added. """ if isinstance(d, dict): if criteria is None or criteria(d): d[key] = value return {k: add_key_in_dict_recursively(v, key, value, criteria) for k, v in d.items()} return d
dict_merge(dct, merge_dct, *, add_keys=True)
Recursive dict merge.
Inspired by :meth:dict.update()
, instead of updating only top-level keys, dict_merge recurses down into dicts nested to an arbitrary depth, updating keys. The merge_dct
is merged into dct
.
This version will return a copy of the dictionary and leave the original arguments untouched.
The optional argument add_keys
, determines whether keys which are present in merge_dict
but not dct
should be included in the new dict.
Parameters
Name | Type | Description | Default |
---|---|---|---|
dct | Optional[dict] | onto which the merge is executed | required |
merge_dct | Optional[dict] | dct merged into dct | required |
add_keys | bool | whether to add new keys | True |
Returns
Name | Type | Description |
---|---|---|
dict | dict | updated dict |
Source Code in griptape/utils/dict_utils.py
def dict_merge(dct: Optional[dict], merge_dct: Optional[dict], *, add_keys: bool = True) -> dict: """Recursive dict merge. Inspired by :meth:``dict.update()``, instead of updating only top-level keys, dict_merge recurses down into dicts nested to an arbitrary depth, updating keys. The ``merge_dct`` is merged into ``dct``. This version will return a copy of the dictionary and leave the original arguments untouched. The optional argument ``add_keys``, determines whether keys which are present in ``merge_dict`` but not ``dct`` should be included in the new dict. Args: dct: onto which the merge is executed merge_dct: dct merged into dct add_keys: whether to add new keys Returns: dict: updated dict """ dct = {} if dct is None else dct merge_dct = {} if merge_dct is None else merge_dct dct = dct.copy() if not add_keys: merge_dct = {k: merge_dct[k] for k in set(dct).intersection(set(merge_dct))} for key in merge_dct: if key in dct and isinstance(dct[key], dict): dct[key] = dict_merge(dct[key], merge_dct[key], add_keys=add_keys) else: dct[key] = merge_dct[key] return dct
remove_key_in_dict_recursively(d, key)
Source Code in griptape/utils/dict_utils.py
def remove_key_in_dict_recursively(d: dict, key: str) -> dict: if isinstance(d, dict): return {k: remove_key_in_dict_recursively(v, key) for k, v in d.items() if k != key} return d
remove_null_values_in_dict_recursively(d)
Source Code in griptape/utils/dict_utils.py
def remove_null_values_in_dict_recursively(d: dict) -> dict: if isinstance(d, dict): return {k: remove_null_values_in_dict_recursively(v) for k, v in d.items() if v is not None} return d
Could this page be better? Report a problem or suggest an addition!