extension.decorator
Decorators for registering axisfuzzy extension functions.
Provides the extension and batch_extension decorators which register
callables into the ExtensionRegistry. Registered callables are later injected
into target classes (e.g. Fuzznum, Fuzzarray) or the top-level axisfuzzy
namespace by the injector at library initialization.
Examples
Simple specialized extension registration:
from axisfuzzy.extension import extension
from axisfuzzy.core import Fuzznum
@extension('distance', mtype='qrofn', target_classes=['Fuzznum'])
def qrofn_distance(f1: Fuzznum, f2: Fuzznum, p: int = 2) -> float:
# qrofn-specific implementation
...
- axisfuzzy.extension.decorator.batch_extension(registrations)[source]
Decorator to register a single function with multiple extension configurations.
This is useful when a single function needs to serve different roles or be registered under various conditions (e.g., as a specialized implementation for one mtype and a default for another, or with different injection types).
- Parameters:
registrations (list of dict) – Each dict supplies keyword arguments for the extension decorator, e.g.
{'name': 'normalize', 'mtype': 'qrofn', 'target_classes': ['Fuzznum']}.- Returns:
A decorator which registers the decorated function multiple times.
- Return type:
callable
Examples
Registering a function that serves as a specialized ‘normalize’ for ‘qrofn’ and a default ‘normalize’ for other types:
# In axisfuzzy/fuzzy/qrofs/_func.py from axisfuzzy.extension import batch_extension from axisfuzzy.core import Fuzznum @batch_extension([ {'name': 'normalize', 'mtype': 'qrofn', 'target_classes': ['Fuzznum']}, {'name': 'normalize', 'is_default': True, 'target_classes': ['Fuzznum']} ]) def qrofn_normalize(fuzz: Fuzznum) -> Fuzznum: # QROFN specific normalization logic # ... return fuzz
- axisfuzzy.extension.decorator.extension(name, mtype=None, target_classes=None, injection_type='both', is_default=False, priority=0, **kwargs)[source]
Register an extension function in the ExtensionRegistry.
This decorator simplifies the process of adding new functionalities to FuzzLab’s
FuzznumandFuzzarrayobjects, or as top-level functions. It acts as a wrapper aroundExtensionRegistry.register(), providing a declarative way to define extension properties.- Parameters:
name (str) – Extension name (e.g.
distance).mtype (str or None, optional) – Target fuzzy-number type (e.g.
qrofn). If None the registration is considered a general/default implementation.target_classes (str or list of str or None, optional) – Class name or list of class names to inject into (e.g.
Fuzznumor["Fuzznum", "Fuzzarray"]). If None, library conventions are used.injection_type ({
instance_method,top_level_function,instance_property,both}, optional) – Injection mode. Default isboth.is_default (bool, optional) – Whether this registration is a fallback when no mtype-specific implementation exists. Default is
False.priority (int, optional) – Resolution priority when multiple candidates match. Higher values take precedence. Default is 0.
**kwargs – Additional metadata forwarded to the registry.
- Returns:
A decorator that accepts the implementation function and registers it.
- Return type:
callable
Examples
Specialized distance for qrofn:
from axisfuzzy.extension import extension from axisfuzzy.core import Fuzznum @extension('distance', mtype='qrofn', target_classes=['Fuzznum']) def qrofn_distance(f1: Fuzznum, f2: Fuzznum, p: int = 2) -> float: # qrofn-specific implementation ...
Default distance fallback:
from axisfuzzy.extension import extension from axisfuzzy.core import Fuzznum @extension('distance', is_default=True, target_classes=['Fuzznum']) def default_distance(f1: Fuzznum, f2: Fuzznum) -> float: # generic fallback implementation ...