Source code for llmp.utils.helper

from datetime import datetime
import copy


[docs]def safe_getter(key: str, *args, default=None): """ performs get operatation in descending order and returns the first value found Args: key (str): key to get *args: list of dictionaries default (Any, optional): default value to return if key not found. Defaults to None. """ def _safe_getter(d: dict): return getattr(d, key, None) for d in args: if hasattr(d, "__getattr__"): v = _safe_getter(d) if v is not None: return v return default
[docs]def update_by_kwargs(d: dict, **kwargs): """Update a dictionary with kwargs.""" d.update({k: v for k, v in kwargs.items()}) return d
[docs]def get_timestamp(): """Return a timestamp.""" return datetime.now().strftime("%Y%m%d%H%M%S")
[docs]def flatten(ar: list | tuple) -> list: ls = [] for item in ar: if isinstance(item, list) or isinstance(item, tuple): ls.extend(flatten(item)) else: ls.append(item) return ls
[docs]def int_or_float(val): if "." in val: return float(val) return int(val)
[docs]class dotdict(dict): def __getattr__(self, key): if key.startswith('__') and key.endswith('__'): return super().__getattr__(key) try: return self[key] except KeyError: raise AttributeError(f"'{type(self).__name__}' object has no attribute '{key}'") def __setattr__(self, key, value): if key.startswith('__') and key.endswith('__'): super().__setattr__(key, value) else: self[key] = value def __delattr__(self, key): if key.startswith('__') and key.endswith('__'): super().__delattr__(key) else: del self[key] def __deepcopy__(self, memo): # Use the default dict copying method to avoid infinite recursion. return dotdict(copy.deepcopy(dict(self), memo))