Newer
Older
# Copyright (C) 2024, UChicago Argonne, LLC
# Licensed under the 3-clause BSD license. See accompanying LICENSE.txt file
# in the top-level directory.
from collections import OrderedDict
from typing import TypeVar, Dict
from collections.abc import Callable
K = TypeVar("K")
V = TypeVar("V")
def merge_dictionaries(dct_a: Dict[K, V], dct_b: Dict[K, V], default: object, operation: Callable) -> Dict[K, V]:
"""given two dictionaries, merge them. If the key is in both, use the operation to combine
the two values."""
dct_c = OrderedDict()
for key_a, value_a in dct_a.items():
dct_c[key_a] = dct_a[key_a]
for key_b, value_b in dct_b.items():
dct_c[key_b] = operation(dct_c.get(key_b, default), value_b)
return dct_c
class partial_arg_kw:
"""a helper function to apply arguments and kwargs to a function.
partial args are applied first and kwargs are applied after the partial kwargs."""
def __init__(self, func, *args, **kwargs):
self.func = func
self.args = args
self.kwargs = kwargs
def __call__(self, *args, **kwargs):
return self.func(*self.args, *args, **kwargs, **self.kwargs)