from functools import wraps import inspect class FilterRegistry: def __init__(self): self.filters = {} self.params_map = {} def register(self, name, defaults=None, min_vals=None, max_vals=None, step_vals=None): if defaults is None: defaults = {} if min_vals is None: min_vals = {} if max_vals is None: max_vals = {} if step_vals is None: step_vals = {} def decorator(func): self.filters[name] = func sig = inspect.signature(func) params = {} for param in sig.parameters.values(): if param.name == 'image': continue params[param.name] = { 'type': param.annotation, 'default': param.default if param.default != inspect.Parameter.empty else defaults.get(param.name), 'min': min_vals.get(param.name), 'max': max_vals.get(param.name), 'step': step_vals.get(param.name) } self.params_map[name] = params return func return decorator registry = FilterRegistry()