Source code for roboglia.utils.factory

# Copyright (C) 2020  Alex Sonea

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import logging

logger = logging.getLogger(__name__)

__registered_classes = {}


[docs]def register_class(class_obj): """Registers a class with the class factory dictionary. If the class is already registered the function does not replace it. In the factory the class is represented by name. Args: cls (class object): is the class to be registerd. Raises: ValueError: if the parameter passed is not a Class object. """ if not isinstance(class_obj, type): mess = f'{class_obj} is not a Class object. ' + \ 'You must pass a Class not an instance.' logger.critical(mess) raise ValueError(mess) if class_obj.__name__ not in __registered_classes: __registered_classes[class_obj.__name__] = class_obj
[docs]def unregister_class(class_name): """Removes a class from the class factory dictionary thus making it unavaialble for dynamic instantiation. Args: class_name (str): the name of the class to be removed. Raises: KeyError: if the class name is not in the class factory dictionary. """ if class_name not in __registered_classes: mess = f'class {class_name} not registered with the factory' logger.critical(mess) raise KeyError(mess) else: del __registered_classes[class_name]
[docs]def get_registered_class(class_name): """Retrieves a class object from the class factory by name. Args: class_name (str): the name of the class to be retrieved. Returns: class type: the class requested Raises: KeyError: if the class name is not in the class factory dictionary. Example: The way the `get_regstered_class` is to be used is by first retrieving the needed class object and then instantiating it according to the rules for that class:: bus_class = get_registered_class('DynamixelBus') bus = bus_class(init_dict) """ if class_name in __registered_classes: return __registered_classes[class_name] else: mess = f'class {class_name} not registered with the factory' logger.critical(mess) raise KeyError(mess)
[docs]def registered_classes(): """Convenience function to inspect the dictionary of registered classes. Returns: dict: the registered class dictionary in format {class_name: class_ref} """ return __registered_classes