Source code for ocrd_utils.introspect

"""
Utility functions to simplify access to data structures.
"""
import json
from functools import wraps
from frozendict import frozendict


# Taken from https://github.com/OCR-D/core/pull/884
[docs]def freeze_args(func): """ Transform mutable dictionary into immutable. Useful to be compatible with cache. Code taken from `this post <https://stackoverflow.com/a/53394430/1814420>`_ """ @wraps(func) def wrapped(*args, **kwargs): args = tuple([frozendict(arg) if isinstance(arg, dict) else arg for arg in args]) kwargs = {k: frozendict(v) if isinstance(v, dict) else v for k, v in kwargs.items()} return func(*args, **kwargs) return wrapped
[docs]def membername(class_, val): """Convert a member variable/constant into a member name string.""" return next((k for k, v in class_.__dict__.items() if v == val), str(val))
[docs]def set_json_key_value_overrides(obj, *kvpairs): for kv in kvpairs: k, v = kv try: obj[k] = json.loads(v) except json.decoder.JSONDecodeError: obj[k] = v return obj