Better handling of elements names in Cython
This commit is contained in:
@ -160,7 +160,7 @@ cdef class Column(OBIWrapper) :
|
||||
|
||||
column._view = view
|
||||
column._alias = column_name_b
|
||||
column.elements_names = column._elements_names
|
||||
column._elements_names = column.read_elements_names()
|
||||
view.register(column)
|
||||
|
||||
return column
|
||||
@ -274,6 +274,19 @@ cdef class Column(OBIWrapper) :
|
||||
# raise Exception("Problem closing column %s" % bytes2str(self.name))
|
||||
|
||||
|
||||
cdef read_elements_names(self):
|
||||
cdef char* elts_names_b
|
||||
cdef list elts_names_list
|
||||
if not self.active() :
|
||||
raise OBIDeactivatedInstanceError()
|
||||
elts_names_b = obi_get_elements_names(self.pointer())
|
||||
if elts_names_b == NULL:
|
||||
raise Exception("Error reading the elements names of a column")
|
||||
elts_names_list = elts_names_b.split(b';')
|
||||
free(elts_names_b)
|
||||
return elts_names_list
|
||||
|
||||
|
||||
# Column alias property getter and setter
|
||||
@property
|
||||
def name(self):
|
||||
@ -285,20 +298,11 @@ cdef class Column(OBIWrapper) :
|
||||
if not self.active() :
|
||||
raise OBIDeactivatedInstanceError()
|
||||
self._view.rename_column(self._alias, new_alias)
|
||||
|
||||
|
||||
# elements_names property getter
|
||||
@property
|
||||
def _elements_names(self):
|
||||
cdef char* elts_names_b
|
||||
cdef list elts_names_list
|
||||
if not self.active() :
|
||||
raise OBIDeactivatedInstanceError()
|
||||
elts_names_b = obi_get_elements_names(self.pointer())
|
||||
if elts_names_b == NULL:
|
||||
raise Exception("Error reading the elements names of a column")
|
||||
elts_names_list = elts_names_b.split(b';')
|
||||
free(elts_names_b)
|
||||
return elts_names_list
|
||||
def elements_names(self):
|
||||
return self._elements_names
|
||||
|
||||
# nb_elements_per_line property getter
|
||||
@property
|
||||
@ -386,7 +390,7 @@ cdef class Column_multi_elts(Column) :
|
||||
if not self.active() :
|
||||
raise OBIDeactivatedInstanceError()
|
||||
if values is None or len(values) == 0 :
|
||||
for element_name in self.elements_names :
|
||||
for element_name in self._elements_names :
|
||||
self.set_item(line_nb, element_name, None)
|
||||
else :
|
||||
values_iter = xrange(len(values)) if isinstance(values, list) else values
|
||||
@ -427,7 +431,7 @@ cdef class Column_line :
|
||||
if type(elt_id) == int:
|
||||
return elt_id < self._column.nb_elements_per_line
|
||||
else:
|
||||
return (tobytes(elt_id) in self._column.elements_names)
|
||||
return (tobytes(elt_id) in self._column._elements_names)
|
||||
|
||||
|
||||
def __repr__(self) :
|
||||
@ -437,13 +441,13 @@ cdef class Column_line :
|
||||
def __iter__(self) :
|
||||
cdef list elements_names
|
||||
cdef bytes element_name
|
||||
elements_names = self._column.elements_names
|
||||
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
|
||||
return self._column._elements_names
|
||||
|
||||
|
||||
# column property getter
|
||||
|
Reference in New Issue
Block a user