File size: 1,753 Bytes
8a71b8a
 
4bb69b3
8a71b8a
 
 
 
 
 
4bb69b3
8a71b8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4bb69b3
8a71b8a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from functools import wraps
import inspect

class FilterRegistry:
    """Registry để quản lý các bộ lọc và tham số của chúng"""
    
    def __init__(self):
        self.filters = {}
        self.params_map = {}

    def register(self, name, defaults=None, min_vals=None, max_vals=None, step_vals=None):
        """
        Decorator để đăng ký một bộ lọc
        
        Args:
            name: Tên bộ lọc
            defaults: Giá trị mặc định cho các tham số
            min_vals: Giá trị tối thiểu cho các tham số
            max_vals: Giá trị tối đa cho các tham số
            step_vals: Bước nhảy cho các tham số
        """
        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()