def overwrite_inherited_attribute(child_setting_dict: dict, setting_list: list, child_instance, obj) -> None: """ use value from child, take parent value as fallback :param child_setting_dict: :param setting_list: :param child_instance: :param obj: :return: """ try: for key in setting_list: if key in child_setting_dict: try: if not hasattr(child_instance, key): setattr(child_instance, key, child_setting_dict[key]) elif getattr(child_instance, key) == child_setting_dict[key]: pass else: raise AttributeError( censor( f"Unable to set attribute since it already exists: current value \"{getattr(child_instance, key)}\", new value \"{child_setting_dict[key]}\"" )) except NameError: # if it already exists as property and should be overwritten setattr(child_instance, key, child_setting_dict[key]) else: set_property(obj=obj, key=key) except SETTING_DICT_EXCEPTION as error_msg: raise SETTING_DICT_EXCEPTION( censor(SETTING_DICT_ERROR % (error_msg, child_instance.name, child_instance.object_id, obj, child_setting_dict)))
def _error(self, msg: str): log(f"SQL connection error: \"{msg}\"", level=3) try: self.connection.rollback() except (UnboundLocalError, AttributeError): pass raise ConnectionError(censor(msg))
def __init__(self, parent_instance, setting_dict: dict, **kwargs): # inheritance from superclasses super().__init__(**kwargs) # vars for all devices self.parent_instance = parent_instance self.locked = False self.fail_count = 0 self.fail_sleep = None self.setting_dict = setting_dict # vars from settings dict try: self.device_enabled = setting_dict[ 'enabled'] # not dynamically set because of device-only attribute except SETTING_DICT_EXCEPTION as error_msg: raise SETTING_DICT_EXCEPTION(censor(SETTING_DICT_ERROR % error_msg))
def set_parent_attribute(child_instance, setting_list: list, obj) -> None: """ inherit all parent instance attributes listed in setting_list (via properties) :param child_instance: :param setting_list: :param obj: :return: """ try: for key in setting_list: set_property(obj=obj, key=key) except SETTING_DICT_EXCEPTION as error_msg: raise SETTING_DICT_EXCEPTION( censor(SETTING_DICT_ERROR % (error_msg, child_instance.name, child_instance.object_id, obj, setting_list)))
def set_attribute(setting_dict: dict, setting_list: list, instance, obj) -> None: """ convert setting_dict key:values to instance attributes :param setting_dict: :param setting_list: :param instance: :param obj: :return: """ try: for key in setting_list: if key not in setting_list: raise SETTING_DICT_EXCEPTION( f"Setting \"{key}\" was not provided") else: setattr(instance, key, setting_dict[key]) except SETTING_DICT_EXCEPTION as error_msg: raise SETTING_DICT_EXCEPTION( censor(SETTING_DICT_ERROR % (error_msg, instance.name, instance.object_id, obj, setting_dict)))
def _error(msg): log(f"Received error \"{msg}\"") raise ConnectionError(censor(msg))