Source code for seabreeze.pyseabreeze.features._base

from functools import partial

from seabreeze.pyseabreeze.exceptions import SeaBreezeError
from seabreeze.pyseabreeze.protocol import ProtocolInterface

try:
    from functools import partialmethod
except ImportError:
    # https://gist.github.com/carymrobbins/8940382
    # noinspection PyPep8Naming
    class partialmethod(partial):
        def __get__(self, instance, owner):
            if instance is None:
                return self
            args, kwargs = self.args or (), self.keywords or {}
            return partial(self.func, instance, *args, **kwargs)


[docs]class SeaBreezeFeature(object): identifier = "base_feature" _required_kwargs = () _required_features = () _required_protocol_cls = ProtocolInterface def __init__(self, protocol, feature_id, **kwargs): """SeaBreezeFeature base class Parameters ---------- protocol : Type[seabreeze.pyseabreeze.protocol.ProtocolInterface} feature_id : int """ if self.identifier == "base_feature": raise SeaBreezeError("Don't instantiate SeaBreezeFeature directly. Use derived feature classes.") assert set(self._required_kwargs) == set(kwargs), "{} vs {}".format( str(set(self._required_kwargs)), str(set(kwargs)) ) # check protocol support if not isinstance(protocol, self._required_protocol_cls): raise SeaBreezeError("FeatureError: Protocol not supported by feature") self.protocol = protocol self.feature_id = feature_id def __repr__(self): return "<{} id={}>".format(self.__class__.__name__, self.feature_id)
[docs] @classmethod def get_feature_class_registry(cls): # noinspection PyUnresolvedReferences return {feature_class.identifier: feature_class for feature_class in SeaBreezeFeature.__subclasses__()}
[docs] @classmethod def supports_protocol(cls, protocol): return isinstance(protocol, cls._required_protocol_cls)
[docs] @classmethod def specialize(cls, model_name, **kwargs): assert set(kwargs) == set(cls._required_kwargs) specialized_class = type("{}{}".format(cls.__name__, model_name), (cls, ), { '__init__': partialmethod(cls.__init__, **kwargs) }) return specialized_class