Attempt to speed up converting from a dictionary
This commit is contained in:
@@ -496,6 +496,9 @@ cdef class _DynamicListBuilder:
|
|||||||
index = index % size
|
index = index % size
|
||||||
return self._get(index)
|
return self._get(index)
|
||||||
|
|
||||||
|
cdef _set(self, index, value):
|
||||||
|
_setDynamicField(self.thisptr, index, value, self._parent)
|
||||||
|
|
||||||
def __setitem__(self, index, value):
|
def __setitem__(self, index, value):
|
||||||
size = self.thisptr.size()
|
size = self.thisptr.size()
|
||||||
if index >= size:
|
if index >= size:
|
||||||
@@ -675,8 +678,7 @@ cdef _setDynamicField(_DynamicSetterClasses thisptr, field, value, parent):
|
|||||||
del temp2
|
del temp2
|
||||||
elif value_type is list:
|
elif value_type is list:
|
||||||
builder = to_python_builder(thisptr.init(field, len(value)), parent)
|
builder = to_python_builder(thisptr.init(field, len(value)), parent)
|
||||||
for (i, v) in enumerate(value):
|
_from_list(builder, value)
|
||||||
builder[i] = v
|
|
||||||
elif value_type is dict:
|
elif value_type is dict:
|
||||||
if (_DynamicSetterClasses is DynamicStruct_Builder or _DynamicSetterClasses is Request):
|
if (_DynamicSetterClasses is DynamicStruct_Builder or _DynamicSetterClasses is Request):
|
||||||
builder = to_python_builder(thisptr.get(field), parent)
|
builder = to_python_builder(thisptr.get(field), parent)
|
||||||
@@ -727,8 +729,7 @@ cdef _setDynamicFieldPtr(_DynamicSetterClasses * thisptr, field, value, parent):
|
|||||||
del temp2
|
del temp2
|
||||||
elif value_type is list:
|
elif value_type is list:
|
||||||
builder = to_python_builder(thisptr.init(field, len(value)), parent)
|
builder = to_python_builder(thisptr.init(field, len(value)), parent)
|
||||||
for (i, v) in enumerate(value):
|
_from_list(builder, value)
|
||||||
builder[i] = v
|
|
||||||
elif value_type is dict:
|
elif value_type is dict:
|
||||||
if (_DynamicSetterClasses is DynamicStruct_Builder or _DynamicSetterClasses is Request):
|
if (_DynamicSetterClasses is DynamicStruct_Builder or _DynamicSetterClasses is Request):
|
||||||
builder = to_python_builder(thisptr.get(field), parent)
|
builder = to_python_builder(thisptr.get(field), parent)
|
||||||
@@ -769,36 +770,17 @@ cdef _to_dict(msg, bint verbose):
|
|||||||
|
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
cdef _from_dict_helper(msg, field, d):
|
|
||||||
d_type = type(d)
|
|
||||||
if d_type is dict:
|
|
||||||
try:
|
|
||||||
sub_msg = getattr(msg, field)
|
|
||||||
except Exception as e:
|
|
||||||
str_error = str(e)
|
|
||||||
if 'expected isSetInUnion(field)' in str_error:
|
|
||||||
msg.init(field)
|
|
||||||
sub_msg = getattr(msg, field)
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
for key, val in d.iteritems():
|
|
||||||
_from_dict_helper(sub_msg, key, val)
|
|
||||||
elif d_type is list and len(d) > 0:
|
|
||||||
l = msg.init(field, len(d))
|
|
||||||
for i in range(len(d)):
|
|
||||||
if isinstance(d[i], (dict, list)):
|
|
||||||
for key, val in d[i].iteritems():
|
|
||||||
_from_dict_helper(l[i], key, val)
|
|
||||||
else:
|
|
||||||
l[i] = d[i]
|
|
||||||
else:
|
|
||||||
setattr(msg, field, d)
|
|
||||||
|
|
||||||
|
cdef _from_dict(_DynamicStructBuilder msg, dict d):
|
||||||
cdef _from_dict(msg, d):
|
|
||||||
for key, val in d.iteritems():
|
for key, val in d.iteritems():
|
||||||
if key != 'which':
|
if key != 'which':
|
||||||
_from_dict_helper(msg, key, val)
|
msg._set(key, val)
|
||||||
|
|
||||||
|
cdef _from_list(_DynamicListBuilder msg, list d):
|
||||||
|
cdef size_t count = 0
|
||||||
|
for val in d:
|
||||||
|
msg._set(count, val)
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
|
||||||
cdef class _DynamicStructReader:
|
cdef class _DynamicStructReader:
|
||||||
@@ -968,9 +950,12 @@ cdef class _DynamicStructBuilder:
|
|||||||
def __getattr__(self, field):
|
def __getattr__(self, field):
|
||||||
return self._get(field)
|
return self._get(field)
|
||||||
|
|
||||||
def __setattr__(self, field, value):
|
cdef _set(self, field, value):
|
||||||
_setDynamicField(self.thisptr, field, value, self._parent)
|
_setDynamicField(self.thisptr, field, value, self._parent)
|
||||||
|
|
||||||
|
def __setattr__(self, field, value):
|
||||||
|
self._set(field, value)
|
||||||
|
|
||||||
def _has(self, field):
|
def _has(self, field):
|
||||||
return self.thisptr.has(field)
|
return self.thisptr.has(field)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user