def _set_value(self, value: Any) -> None: from omegaconf import OmegaConf if OmegaConf.is_none(value): if not self._is_optional(): raise ValidationError( "Non optional ListConfig cannot be constructed from None") self.__dict__["_content"] = None elif get_value_kind(value) == ValueKind.MANDATORY_MISSING: self.__dict__["_content"] = "???" elif get_value_kind(value) in ( ValueKind.INTERPOLATION, ValueKind.STR_INTERPOLATION, ): self.__dict__["_content"] = value else: assert is_primitive_list(value) or isinstance(value, ListConfig) self.__dict__["_content"] = [] if isinstance(value, ListConfig): self.__dict__["_metadata"] = copy.deepcopy(value._metadata) self.__dict__["_metadata"].flags = {} for item in value._iter_ex(resolve=False): self.append(item) self.__dict__["_metadata"].flags = copy.deepcopy( value._metadata.flags) elif is_primitive_list(value): for item in value: self.append(item) if isinstance(value, ListConfig): self.__dict__["_metadata"].flags = value._metadata.flags
def format_and_raise( node: Any, key: Any, value: Any, msg: str, cause: Exception, type_override: Any = None, ) -> None: from omegaconf import OmegaConf from omegaconf.base import Node # Uncomment to make debugging easier. Note that this will cause some tests to fail # raise cause if isinstance(cause, AssertionError): raise if isinstance(cause, OmegaConfBaseException) and cause._initialized: ex = cause if type_override is not None: ex = type_override(str(cause)) ex.__dict__ = copy.deepcopy(cause.__dict__) _raise(ex, cause) object_type: Optional[Type[Any]] object_type_str: Optional[str] = None ref_type: Optional[Type[Any]] ref_type_str: Optional[str] child_node: Optional[Node] = None if node is None: full_key = "" object_type = None ref_type = None ref_type_str = None else: if key is not None and not OmegaConf.is_none(node): child_node = node._get_node(key, validate_access=False) full_key = node._get_full_key(key=key) object_type = OmegaConf.get_type(node) object_type_str = type_str(object_type) ref_type = get_ref_type(node) ref_type_str = type_str(ref_type) msg = string.Template(msg).substitute( REF_TYPE=ref_type_str, OBJECT_TYPE=object_type_str, KEY=key, FULL_KEY=full_key, VALUE=value, VALUE_TYPE=f"{type(value).__name__}", KEY_TYPE=f"{type(key).__name__}", ) template = """$MSG \tfull_key: $FULL_KEY \treference_type=$REF_TYPE \tobject_type=$OBJECT_TYPE""" s = string.Template(template=template) message = s.substitute(REF_TYPE=ref_type_str, OBJECT_TYPE=object_type_str, MSG=msg, FULL_KEY=full_key) exception_type = type(cause) if type_override is None else type_override if exception_type == TypeError: exception_type = ConfigTypeError elif exception_type == IndexError: exception_type = ConfigIndexError ex = exception_type(f"{message}") if issubclass(exception_type, OmegaConfBaseException): ex._initialized = True ex.msg = message ex.parent_node = node ex.child_node = child_node ex.key = key ex.full_key = full_key ex.value = value ex.object_type = object_type ex.object_type_str = object_type_str ex.ref_type = ref_type ex.ref_type_str = ref_type_str _raise(ex, cause)