def __getattr__(self, name): """ Lookup the given variable in the local variables and the ARTS workspace. Args: name(str): Name of the attribute (variable) Raises: ValueError: If the variable is not found. """ group_id = None if name in self._vars: var = self._vars[name] var.update() return var else: i = arts_api.lookup_workspace_variable(name.encode()) if i < 0: raise AttributeError("No workspace variable " + str(name) + " found.") vs = arts_api.get_variable(i) group_id = vs.group description = vs.description.decode("utf8") # Get its symbolic representation wsv = WorkspaceVariable(i, name, group_names[group_id], description, self) return wsv
def create(self, ws, name=None): """ Call to <Group>Create WSMs are handled differently. This method simply determines the group type from the function name and then add a variable of this type to the workspace ws. A handle of this variable is then added to as attribute to the arts.workspace.variables module. Args: ws(Workspace): Workspace object to add the variable to name(str): Name of the variable to add to the workspace """ group = WorkspaceMethod.create_regexp.match(self.name).group(1) group_id = group_ids[group] if not name: name = "__anonymous_" + str(len(ws._vars)) ws_id = arts_api.add_variable(ws.ptr, group_id, name.encode()) else: # Is there a WSM with that name? if name in workspace_methods.keys(): raise Exception("A WSM with the name " + name + " already exists.") # Is there a WSV with that name? ws_id = arts_api.lookup_workspace_variable(name.encode()) # Is yes, check that it is of the same group? if not ws_id == -1: v = arts_api.get_variable(ws_id) if not v.group == group_id: raise Exception("A WSV with the name " + name + " but of goup " + group_names[v.group] + " already exists.") # Otherwise we add the variable. else: ws_id = arts_api.add_variable(ws.ptr, group_id, name.encode()) wsv = WorkspaceVariable(ws_id, name, group, "User defined variable.", ws) setattr(variables, name, wsv) ws._vars[name] = wsv return wsv