Source code for nv_ingest_api.util.converters.containers
# SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES.
# All rights reserved.
# SPDX-License-Identifier: Apache-2.0
import logging
from typing import Any
from typing import Dict
logger = logging.getLogger(__name__)
[docs]
def merge_dict(defaults: Dict[str, Any], overrides: Dict[str, Any]) -> Dict[str, Any]:
"""
Recursively merges two dictionaries, with values from the `overrides` dictionary taking precedence.
This function merges the `overrides` dictionary into the `defaults` dictionary. If a key in both dictionaries
has a dictionary as its value, the function will recursively merge those dictionaries. Otherwise, the value
from the `overrides` dictionary will overwrite the value in the `defaults` dictionary.
Parameters
----------
defaults : dict of {str: Any}
The default dictionary that will be updated with values from the `overrides` dictionary.
overrides : dict of {str: Any}
The dictionary containing values that will override or extend those in the `defaults` dictionary.
Returns
-------
dict of {str: Any}
The merged dictionary, with values from the `overrides` dictionary taking precedence.
Examples
--------
>>> defaults = {
... "a": 1,
... "b": {
... "c": 3,
... "d": 4
... },
... "e": 5
... }
>>> overrides = {
... "b": {
... "c": 30
... },
... "f": 6
... }
>>> result = merge_dict(defaults, overrides)
>>> result
{'a': 1, 'b': {'c': 30, 'd': 4}, 'e': 5, 'f': 6}
Notes
-----
- The `merge_dict` function modifies the `defaults` dictionary in place. If you need to preserve the original
`defaults` dictionary, consider passing a copy instead.
- This function is particularly useful when combining configuration dictionaries where certain settings should
override defaults.
"""
for key, value in overrides.items():
if isinstance(value, dict) and value:
defaults[key] = merge_dict(defaults.get(key, {}), value)
else:
defaults[key] = overrides[key]
return defaults