From 8a9ba8b0a85c1d55cf28e48e3b28b30061cd3115 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Wed, 17 Oct 2018 11:23:07 +0200 Subject: [PATCH] Cython: Added Column line methods to get a Column line as a str or bytes, and elements (keys, values) with None values are not returned anymore --- python/obitools3/dms/column/column.pxd | 6 +++- python/obitools3/dms/column/column.pyx | 44 +++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/python/obitools3/dms/column/column.pxd b/python/obitools3/dms/column/column.pxd index d182f55..7e68906 100644 --- a/python/obitools3/dms/column/column.pxd +++ b/python/obitools3/dms/column/column.pxd @@ -43,7 +43,11 @@ cdef class Column_line: cdef Column _column cdef index_t _index - + + cpdef list keys(self) + cpdef list items(self) + cpdef dict dict(self) + cpdef bytes bytes(self) cpdef update(self, object data) diff --git a/python/obitools3/dms/column/column.pyx b/python/obitools3/dms/column/column.pyx index 175616b..aae7f71 100644 --- a/python/obitools3/dms/column/column.pyx +++ b/python/obitools3/dms/column/column.pyx @@ -543,15 +543,51 @@ cdef class Column_line : def __iter__(self) : cdef list elements_names cdef bytes element_name - elements_names = self._column._elements_names - for element_name in elements_names : + for element_name in self._column.get_line(self._index) : yield element_name - def keys(self): # TODO Discuss if keys with None values should be returned too - return self._column._elements_names + cpdef list keys(self): + # TODO just returning all element names of the column would be faster but + # potentially lots of keys associated with None values on that given line. + # get_line() methods don't return None values + return [element_name for element_name in self._column.get_line(self._index)] + cpdef list items(self): + return [(k, self[k]) for k in self.keys()] + + + cpdef dict dict(self): + cdef dict d + d = {} + for k,v in self.items(): + d[k] = v + return d + + + def __str__(self): + cdef dict d + cdef str s + d = {} + for k,v in self.items(): + if type(v) == bytes: + value = bytes2str(v) + else: + value = v + d[bytes2str(k)] = value + s = str(d) + return s + + + cpdef bytes bytes(self): + cdef str s + cdef bytes b + s = self.__str__() + b = str2bytes(s) + return b + + # column property getter @property def column(self):