Source code for tensorbay.utility.common

#!/usr/bin/env python3
#
# Copyright 2021 Graviti. Licensed under MIT License.
#

"""Common tools."""


from collections import defaultdict
from functools import wraps
from threading import Lock
from typing import Any, Callable, DefaultDict, Sequence, Type, TypeVar, Union

import numpy as np

_T = TypeVar("_T")
_CallableWithoutReturnValue = TypeVar("_CallableWithoutReturnValue", bound=Callable[..., None])

MatrixType = Union[Sequence[Sequence[float]], np.ndarray]


[docs]def common_loads(object_class: Type[_T], contents: Any) -> _T: """A common method for loading an object from a dict or a list of dict. Arguments: object_class: The class of the object to be loaded. contents: The information of the object in a dict or a list of dict. Returns: The loaded object. """ obj: _T = object.__new__(object_class) obj._loads(contents) # type: ignore[attr-defined] # pylint: disable=protected-access return obj
[docs]class EqMixin: """A mixin class to support __eq__() method. The __eq__() method defined here compares all the instance variables. """ def __eq__(self, other: object) -> bool: if not isinstance(other, self.__class__): return False return self.__dict__ == other.__dict__
locks: DefaultDict[int, Lock] = defaultdict(Lock)
[docs]def locked(func: _CallableWithoutReturnValue) -> _CallableWithoutReturnValue: """The decorator to add threading lock for methods. Arguments: func: The method needs to add threading lock. Returns: The method with theading locked. """ @wraps(func) def wrapper(self: Any, *arg: Any, **kwargs: Any) -> None: key = id(self) lock = locks[key] acquire = lock.acquire(blocking=False) try: if acquire: func(self, *arg, **kwargs) del locks[key] else: lock.acquire() finally: lock.release() return wrapper # type: ignore[return-value]