Source code for gabrieltool.statemachine.callable_zoo.base

"""Base class and helper functions for callable classes.
"""
import inspect
from functools import wraps


[docs]def record_kwargs(func): """ Decorator to automatically record constructor arguments >>> class process: ... @record_kwargs ... def __init__(self, cmd, reachable=False, user='root'): ... pass >>> p = process('halt', True) >>> p.cmd, p.reachable, p.user ('halt', True, 'root') """ names, varargs, keywords, defaults = inspect.getargspec(func) if defaults is None: defaults = () @wraps(func) def wrapper(self, *args, **kargs): func(self, *args, **kargs) kwargs = {} for name, default in zip(reversed(names), reversed(defaults)): kwargs[name] = default for name, arg in list(zip(names[1:], args)) + list(kargs.items()): kwargs[name] = arg setattr(self, 'kwargs', kwargs) return wrapper
[docs]class CallableBase(): """Base class for Callables used in FSMs. Custom callable classes need to inherit from this class. Inherited classes should add decorator @record_kwargs to their constructors for serialization. """ def __init__(self): super().__init__() setattr(self, 'kwargs', {})
[docs] @classmethod def from_json(cls, json_obj): """Create a CallableBase class instance from a json object. Subclasses should overide this class depending on the input type of their constructor. """ return cls(**json_obj)
def __eq__(self, other): if isinstance(other, CallableBase): return self.kwargs == other.kwargs return False def __ne__(self, other): return not self.__eq__(other)
[docs]class Null(CallableBase): """A empty callable class that returns None. Useful for initialization. """ def __call__(self, *args, **kwargs): return None