CALLBACKS = { 'validate': lambda self, value: True, 'render': lambda self, *args, **kwargs: '', 'digest_key': None, 'rendervalue': lambda self, *args, **kwargs: self.value, 'initializer': None, } class Field: def wrap_callback(self, cb): if cb is None: return def func(*args, **kwargs): return cb(self, *args, **kwargs) return func def __init__(self, *, is_multiple=False, **callbacks): self.apply_filters = [] for cb in CALLBACKS.keys(): func = self.wrap_callback( callbacks.get(cb, CALLBACKS[cb]) ) if func is not None: setattr(self, cb, func) self.initializer = callbacks.get('initializer', lambda: '') #self.digest_key = callbacks.get('digest_key', None) self.error_msg = '' self.multiple = is_multiple self.options_map = {} self.is_valid = None @property def value(self): if not hasattr(self, '_value'): self._value = self.initializer() return self._value @value.setter def value(self, value): self._value = value class ValidationError(RuntimeError): pass