Cython utils: functions convert to bytes or str and to remove all empty

objects from a complex object
This commit is contained in:
Celine Mercier
2018-10-07 19:03:38 +02:00
parent 704d9b0474
commit ffd5bc76bf
2 changed files with 68 additions and 0 deletions

View File

@ -8,6 +8,10 @@ cdef bytes str2bytes(str string)
cdef str bytes2str(bytes string) cdef str bytes2str(bytes string)
cdef bytes tobytes(object string) cdef bytes tobytes(object string)
cdef str tostr(object string) cdef str tostr(object string)
cdef object bytes2str_object(object value)
cdef object str2bytes_object(object value)
cdef object clean_empty_values_from_object(object value, exclude=*)
cdef obitype_t get_obitype_single_value(object value) cdef obitype_t get_obitype_single_value(object value)
cdef obitype_t update_obitype(obitype_t obitype, object new_value) cdef obitype_t update_obitype(obitype_t obitype, object new_value)

View File

@ -87,6 +87,70 @@ cdef str tostr(object string):
return bytes2str(string) return bytes2str(string)
cdef object bytes2str_object(object value): # Only works if complex types are dict or list
if isinstance(value, dict):
items = [(k,v) for k,v in value.items()]
for k, v in items:
if isinstance(v, list) or isinstance(v, dict):
value[k] = bytes2str_object(v)
else:
if type(v) == bytes:
value[k] = bytes2str(v)
if type(k) == bytes:
value[bytes2str(k)] = value.pop(k)
elif isinstance(value, list):
for i in range(len(value)):
if isinstance(value[i], list) or isinstance(value[i], dict):
value[i] = bytes2str_object(value[i])
if type(value[i]) == bytes:
value[i] = bytes2str(value[i])
elif type(value) == bytes:
value = bytes2str(value)
return value
cdef object str2bytes_object(object value): # Only works if complex types are dict or list
if isinstance(value, dict):
items = [(k,v) for k,v in value.items()]
for k, v in items:
if isinstance(v, list) or isinstance(v, dict):
value[k] = str2bytes_object(v)
else:
if type(v) == str:
value[k] = str2bytes(v)
if type(k) == str:
value[str2bytes(k)] = value.pop(k)
elif isinstance(value, list):
for i in range(len(value)):
if isinstance(value[i], list) or isinstance(value[i], dict):
value[i] = str2bytes_object(value[i])
if type(value[i]) == str:
value[i] = str2bytes(value[i])
elif type(value) == str:
value = str2bytes(value)
return value
cdef object clean_empty_values_from_object(object value, exclude=[]): # Only works if complex types are dict or list
if isinstance(value, dict):
items = [(k,v) for k,v in value.items()]
for k, v in items:
if isinstance(v, list) or isinstance(v, dict):
value[k] = clean_empty_values_from_object(v)
if (k not in exclude) and (v is None or (hasattr(v, '__len__') and len(v) == 0)):
value.pop(k)
elif isinstance(value, list):
to_remove=[]
for i in range(len(value)):
if isinstance(value[i], list) or isinstance(value[i], dict):
value[i] = clean_empty_values_from_object(value[i])
if value[i] is None or (hasattr(value[i], '__len__') and len(value[i]) == 0):
to_remove.append(value[i])
for v in to_remove:
value.remove(v)
return value
cdef obitype_t get_obitype_single_value(object value) : cdef obitype_t get_obitype_single_value(object value) :
cdef type value_type cdef type value_type