Spaces:
Sleeping
Sleeping
| import random | |
| import string | |
| from abc import ABCMeta, abstractmethod | |
| from typing import Optional, Callable, Mapping, Any, Dict | |
| _LENGTH_OF_RANDOM_TOKEN = 64 | |
| def random_token(length: Optional[int] = None) -> str: | |
| """ | |
| Overview: | |
| Generate random hex token | |
| Arguments: | |
| - length (:obj:`Optional[int]`): Length of the random token (`None` means `64`) | |
| Returns: | |
| - token (:obj:`str`): Generated random token | |
| Example: | |
| >>> random_token() # '4eAbd5218e3d0da5e7AAFcBF48Ea0Df2dadED1bdDF0B8724FdE1569AA78F24A7' | |
| >>> random_token(24) # 'Cd1CdD98caAb8602ac6501aC' | |
| """ | |
| return ''.join([random.choice(string.hexdigits) for _ in range(length or _LENGTH_OF_RANDOM_TOKEN)]) | |
| class ControllableContext(metaclass=ABCMeta): | |
| """ | |
| Overview: | |
| Basic context-supported class structure | |
| Example: | |
| - Common usage | |
| >>> c = MyControllableContext() # One of the superclasses if ControllableContext | |
| >>> c.start() | |
| >>> try: | |
| >>> pass # do anything you like | |
| >>> finally: | |
| >>> c.close() | |
| - Use with keyword (the same as code above) | |
| >>> c = MyControllableContext() # One of the superclasses if ControllableContext | |
| >>> with c as cc: # cc is c, have the same id | |
| >>> pass # do anything you like | |
| """ | |
| def start(self): | |
| """ | |
| Overview: | |
| Start the context | |
| """ | |
| raise NotImplementedError # pragma: no cover | |
| def close(self): | |
| """ | |
| Overview: | |
| Close the context | |
| """ | |
| raise NotImplementedError # pragma: no cover | |
| def __enter__(self): | |
| """ | |
| Overview: | |
| Enter the context | |
| Returns: | |
| - self (:obj:`ControllableContext`): Context object itself | |
| """ | |
| self.start() | |
| return self | |
| def __exit__(self, exc_type, exc_val, exc_tb): | |
| """ | |
| Overview: | |
| Exit the context | |
| """ | |
| self.close() | |
| class ControllableService(ControllableContext, metaclass=ABCMeta): | |
| """ | |
| Overview: | |
| Controllable service with context support, usually has concurrent feature. | |
| Example: | |
| - A common usage | |
| >>> c = MyControllableService() # One of its superclasses is ControllableService | |
| >>> c.start() | |
| >>> try: | |
| >>> pass # do anything you like | |
| >>> finally: | |
| >>> c.shutdown() # shutdown the service | |
| >>> c.join() # wait until service is down | |
| - Use with keyword (the same as code above) | |
| >>> c = MyControllableService() # One of its superclasses is ControllableService | |
| >>> with c as cc: # cc is c, have the same id | |
| >>> pass # do anything you like | |
| """ | |
| def start(self): | |
| """ | |
| Overview: | |
| Start the service | |
| """ | |
| raise NotImplementedError # pragma: no cover | |
| def shutdown(self): | |
| """ | |
| Overview: | |
| Shutdown the service (but service will not down immediately) | |
| """ | |
| raise NotImplementedError # pragma: no cover | |
| def join(self): | |
| """ | |
| Overview: | |
| Wait until the service is completely down | |
| """ | |
| raise NotImplementedError # pragma: no cover | |
| def close(self): | |
| """ | |
| Overview: | |
| Close the service, wait until the service is down. | |
| """ | |
| self.shutdown() | |
| self.join() | |
| def translate_dict_func(d: Mapping[str, Callable[..., Any]]) -> Callable[..., Dict[str, Any]]: | |
| """ | |
| Overview: | |
| Transform dict with funcs to function generating dict. | |
| Arguments: | |
| - d (:obj:`Mapping[str, Callable[..., Any]]`): Dict with funcs | |
| Returns: | |
| - func (:obj:`Callable[..., Dict[str, Any]]`): Function generating dict | |
| Example: | |
| >>> f1 = lambda x, y: x + y | |
| >>> f2 = lambda x, y: x - y | |
| >>> f3 = lambda x, y: x * y | |
| >>> fx = translate_dict_func({'a': f1, 'b': f2, 'c': f3}) | |
| >>> fx(2, 3) # {'a': 5, 'b': -1, 'c': 6} | |
| >>> fx(5, 11) # ('a': 16, 'b': -6, 'c': 55} | |
| """ | |
| def _func(*args, **kwargs) -> Dict[str, Any]: | |
| return {k: f(*args, **kwargs) for k, f in d.items()} | |
| return _func | |
| def default_func(return_value=None) -> Callable[[Callable[..., Any]], Callable[..., Any]]: | |
| """ | |
| Overview: | |
| Transform optional function (maybe `None`) to function with default value | |
| Argument: | |
| - return_value (:obj:): Return value of the default function | |
| Returns: | |
| - decorator (:obj:`Callable[[Callable[..., Any]], Callable[..., Any]]`): A decorator function \ | |
| that can decorator optional function to real function (must be not None) | |
| Example: | |
| >>> f1 = None | |
| >>> f2 = lambda x, y: x + y | |
| >>> ff1 = default_func()(f1) | |
| >>> ft1 = default_func(0)(f1) | |
| >>> ff2 = default_func()(f2) | |
| >>> ff1(2, 3) # None | |
| >>> ft1(2, 3) # 0 | |
| >>> ff2(2, 3) # 5 | |
| """ | |
| def _decorator(func: Callable[..., Any]) -> Callable[..., Any]: | |
| # noinspection PyUnusedLocal | |
| def _func(*args, **kwargs): | |
| return return_value | |
| return func or _func | |
| return _decorator | |