def __setattr__(self, name, value): """ Set workspace variable. This will lookup the workspace variable name and try to set it to value. Args: name(str): Name of the attribute (variable) value(obj): The value to set the workspace variable to. Raises: ValueError: If the variable is not found or if value cannot uniquely converted to a value of a workspace variable. """ try: v = self.__getattr__(name) except: self.__dict__[name] = value return None # Handle empty list or None values. if value is None or (isinstance(value, list) and not value): arts_api.set_variable_value(self.ptr, v.ws_id, v.group_id, VariableValueStruct.empty()) return None self.set_variable(v, value)
def set_variable(self, wsv, value): """ This will set a WSV to the given value. Natively supported types, i.e. any of int, str, [str], [int], numpy.ndarrays, and scipy.sparse, will be copied directly into the newly created WSV. In addition to that all arts types the can be stored to XML can be set to a WSV, but in this case the communication will happen through the file system (cf. :code:`WorkspaceVariable.from_arts`). Args: wsv: The :class:`WorkspaceVariable` to set. value: The Python object representing the value to set :code:`wsv` to. """ if is_empty(value): err = arts_api.set_variable_value(self.ptr, wsv.ws_id, wsv.group_id, VariableValueStruct.empty()) if not err is None: msg = ("The following error occurred when trying to set the" " WSV {}: {}".format(wsv.name, err.decode())) raise Exception(msg) return None group = group_names[WorkspaceVariable.get_group_id(value)] if group != wsv.group: try: converted = WorkspaceVariable.convert(wsv.group, value) except: converted = None if converted is None: raise Exception("Cannot set workspace variable of type {} to " " value '{}'.".format(wsv.group, value)) value = converted s = VariableValueStruct(value) if s.ptr: err = arts_api.set_variable_value(self.ptr, wsv.ws_id, wsv.group_id, s) if not err is None: msg = ("The following error occurred when trying to set the" " WSV {}: {}".format(wsv.name, err.decode())) raise Exception(msg) # If the type is not supported by the C API try to write the type to XML # and read into ARTS workspace. else: try: wsv.from_arts(value) except: raise Exception("Could not set variable since + " + str(type(value)) + " is neither supported by " + "the C API nor arts XML IO.")