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]