Source code for meshed.components
"""
Specialized components for meshed.
"""
from i2 import Sig
from typing import Callable, Any
from operator import itemgetter, attrgetter
from dataclasses import dataclass
from functools import partial
[docs]
@dataclass
class Extractor:
extractor_factory: Callable[[Any], Callable]
extractor_params: Any
# TODO: When migrating CI to 3.10+, can use `kw_only=True` here
# name: str = field(default='extractor', kw_only=True)
# input_name: str = field(default='x', kw_only=True)
# But meanwhile, need an actual __init__ method:
def __init__(
self,
extractor_factory: Callable[[Any], Callable],
extractor_params: Any,
*,
name: str = 'extractor',
input_name: str = 'x',
):
self.extractor_factory = extractor_factory
self.extractor_params = extractor_params
self.name = name
self.input_name = input_name
self.__post_init__()
def __post_init__(self):
self.__name__ = self.name
self.__signature__ = Sig(f'({self.input_name}, /)')
self._call = self.extractor_factory(self.extractor_params)
def __call__(self, x):
return self._call(x)
def _itemgetter(items):
if isinstance(items, str):
items = [items]
return itemgetter(*items)
def _attrgetter(attrs):
if isinstance(attrs, str):
attrs = [attrs]
return attrgetter(*attrs)
Itemgetter = partial(Extractor, _itemgetter, name='itemgetter')
AttrGetter = partial(Extractor, _attrgetter, name='attrgetter')