diff --git a/python/obitools3/dms/column/column.pxd b/python/obitools3/dms/column/column.pxd index eb2be52..81ef1f7 100644 --- a/python/obitools3/dms/column/column.pxd +++ b/python/obitools3/dms/column/column.pxd @@ -39,7 +39,7 @@ cdef class Column_line: cdef Column _column cdef index_t _index - cpdef update(self, data) + cpdef update(self, object data) cdef register_column_class(obitype_t obitype, diff --git a/python/obitools3/dms/column/column.pyx b/python/obitools3/dms/column/column.pyx index 65f37a3..e59a6bc 100644 --- a/python/obitools3/dms/column/column.pyx +++ b/python/obitools3/dms/column/column.pyx @@ -80,24 +80,33 @@ cdef class Column(OBIWrapper) : object alias=b""): # TODO indexer_name? - cdef bytes column_name_b = tobytes(column_name) - cdef bytes alias_b = tobytes(alias) - cdef bytes comments_b = tobytes(comments) - cdef bytes elements_names_b - cdef char* elements_names_p - + cdef bytes column_name_b = tobytes(column_name) + cdef bytes alias_b = tobytes(alias) + cdef bytes comments_b = tobytes(comments) + cdef list elements_names_s + cdef bytes elements_names_b + cdef char* elements_names_p + cdef object elt_name + cdef str elt_name_s + if not view.active() : raise OBIDeactivatedInstanceError() if alias_b == b"" : alias_b = column_name_b - + if elements_names is not None: - elements_names_b = b';'.join([tobytes(x) for x in elements_names]) + elements_names_s = [] + for elt_name in elements_names : + if type(elt_name) != bytes and type(elt_name) != str : + elements_names_s.append(str(elt_name)) + else : + elements_names_s.append(elt_name) + elements_names_b = b';'.join([tobytes(x) for x in elements_names_s]) elements_names_p = elements_names_b else: elements_names_p = NULL - + if (obi_view_add_column(view = view.pointer(), column_name = column_name_b, version_number = -1, @@ -342,15 +351,17 @@ cdef class Column_multi_elts(Column) : return Column_line(self, line_nb) cpdef set_line(self, index_t line_nb, object values): - cdef object element_name + cdef object value_ref + cdef object values_iter if not self.active() : raise OBIDeactivatedInstanceError() - if values is None : + if values is None or len(values) == 0 : for element_name in self.elements_names : self.set_item(line_nb, element_name, None) else : - for element_name in values : - self.set_item(line_nb, element_name, values[element_name]) + values_iter = xrange(len(values)) if isinstance(values, list) else values + for value_ref in values_iter : + self.set_item(line_nb, value_ref, values[value_ref]) ###################################################################################################### @@ -395,7 +406,11 @@ cdef class Column_line : elements_names = self._column.elements_names for element_name in elements_names : yield element_name - + + + def keys(self): # TODO Discuss if keys with None values should be returned too + return self._column.elements_names + # column property getter @property @@ -408,7 +423,7 @@ cdef class Column_line : return self._index - cpdef update(self, data): # TODO ????? + cpdef update(self, object data): if isinstance(data, dict): data=data.items() for key,value in data: