backup materials and knowledge-base docs
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
# Registry Pattern
|
||||
|
||||
## Overview
|
||||
|
||||
The Registry pattern allows components to register themselves via decorators, enabling automatic discovery and centralized management of available types.
|
||||
|
||||
## Structure
|
||||
|
||||
```python
|
||||
# In module __init__.py (e.g., data_module/dataset/__init__.py)
|
||||
from typing import Dict, Callable, TypeVar
|
||||
|
||||
T = TypeVar('T')
|
||||
|
||||
DATASET_FACTORY: Dict[str, type] = {}
|
||||
|
||||
def register_dataset(name: str) -> Callable[[T], T]:
|
||||
"""Decorator to register dataset classes."""
|
||||
def decorator(cls: T) -> T:
|
||||
DATASET_FACTORY[name] = cls
|
||||
return cls
|
||||
return decorator
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```python
|
||||
# In implementation file (e.g., simple_dataset.py)
|
||||
from data_module.dataset import register_dataset
|
||||
|
||||
@register_dataset("simple")
|
||||
class SimpleDataset(Dataset):
|
||||
def __init__(self, cfg):
|
||||
# Implementation
|
||||
pass
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
- **Automatic registration**: Components register themselves on import
|
||||
- **Declarative**: Single decorator line replaces manual registration code
|
||||
- **Import-time discovery**: Auto-import pattern finds all implementations
|
||||
- **Type-safe**: Preserves original class type
|
||||
|
||||
## Implementation Details
|
||||
|
||||
1. Decorator returns the class unchanged (for immediate use)
|
||||
2. Side effect: adds class to factory dict
|
||||
3. Name parameter must be unique per module
|
||||
4. Registration happens at module import time
|
||||
|
||||
## Advanced Patterns
|
||||
|
||||
### Registration with Config
|
||||
|
||||
```python
|
||||
def register_model(name: str):
|
||||
def decorator(cls):
|
||||
MODEL_FACTORY[name] = cls
|
||||
# Add config validation
|
||||
cls._config_schema = getattr(cls, '_config_schema', {})
|
||||
return cls
|
||||
return decorator
|
||||
```
|
||||
|
||||
### Conditional Registration
|
||||
|
||||
```python
|
||||
def register_dataset(name: str, experimental: bool = False):
|
||||
def decorator(cls):
|
||||
if not experimental or cfg.enable_experimental:
|
||||
DATASET_FACTORY[name] = cls
|
||||
return cls
|
||||
return decorator
|
||||
```
|
||||
|
||||
### Multi-Registry
|
||||
|
||||
```python
|
||||
# Multiple registries in one module
|
||||
DATASET_FACTORY = {}
|
||||
AUGMENTATION_FACTORY = {}
|
||||
|
||||
def register_dataset(name: str):
|
||||
def decorator(cls):
|
||||
DATASET_FACTORY[name] = cls
|
||||
return cls
|
||||
return decorator
|
||||
|
||||
def register_augmentation(name: str):
|
||||
def decorator(fn):
|
||||
AUGMENTATION_FACTORY[name] = fn
|
||||
return fn
|
||||
return decorator
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Unique names**: Use descriptive, unique registration names
|
||||
- **Documentation**: Document required parameters in class docstring
|
||||
- **Validation**: Validate config in `__init__`, not in decorator
|
||||
- **Consistency**: Use same naming convention across modules
|
||||
Reference in New Issue
Block a user