Source code for plaid.utils.base

"""Base utilities."""

# -*- coding: utf-8 -*-
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE.txt', which is part of this source code package.
#
#

# %% Imports

from functools import wraps

import numpy as np

# %% Functions


[docs] def generate_random_ASCII(size: int = 16) -> str: """Generate a random ASCII string of the specified size. Args: size (int, optional): The length of the generated string. Defaults to 16. Returns: str: A random ASCII string of the specified size. """ assert size >= 1 rnd_ = chr(np.random.randint(65, 91)) for _ in range(size - 1): val_ = np.random.randint(91 - 65 + 10) if val_ >= 10: rnd_ += chr(val_ - 10 + 65) else: rnd_ += str(val_) return rnd_
[docs] def safe_len(obj): """Safely return the length of an object, or 0 if the object has no length. Parameters ---------- obj : Any The object whose length is to be computed. Returns: ------- int The length of the object if it defines `__len__`, otherwise 0. """ return len(obj) if hasattr(obj, "__len__") else 0
[docs] def delegate_methods(to: str, methods: list[str]): """Class decorator to forward specific methods from a delegate attribute.""" def wrapper(cls): for name in methods: def make_delegate(name): @wraps(getattr(getattr(cls, to, None), name, lambda *_, **__: None)) def method(self, *args, **kwargs): return getattr(getattr(self, to), name)(*args, **kwargs) return method setattr(cls, name, make_delegate(name)) return cls return wrapper
[docs] class NotAllowedError(Exception): """Exception for not allowed usage.""" pass
[docs] class ShapeError(Exception): """Exception for badly shaped tensors.""" pass
[docs] class DeprecatedError(Exception): """Exception for deprecated methods.""" pass