better handling of empty storage and improved addition of new elements

This commit is contained in:
Marco Cammarata 2017-02-09 14:39:29 +01:00
parent 63c07ea3f1
commit 87d9a19242
1 changed files with 19 additions and 6 deletions

View File

@ -188,11 +188,14 @@ class DataStorage(dict):
self.update( **dict(d) ) self.update( **dict(d) )
def __setitem__(self, key, value): def __setitem__(self, key, value):
#print("__setitem__")
setattr(self,key,value) setattr(self,key,value)
super().__setitem__(key, value) super().__setitem__(key, value)
def __setattr__(self, key, value): def __setattr__(self, key, value):
""" allows to add fields with data.test=4 """ """ allows to add fields with data.test=4 """
#print("__setattr__")
if isinstance(value,(dict,collections.OrderedDict)): value = DataStorage(value)
super().__setitem__(key, value) super().__setitem__(key, value)
super().__setattr__(key,value) super().__setattr__(key,value)
@ -208,23 +211,33 @@ class DataStorage(dict):
def __repr__(self): def __repr__(self):
keys = list(self.keys()) keys = list(self.keys())
keys.sort() keys.sort()
if len(keys) == 0: return "Empty DataStorage"
nchars = max(map(len,keys)) nchars = max(map(len,keys))
fmt = "%%%ds %%s" % (nchars) fmt = "%%%ds %%s" % (nchars)
s = ["DataStorage obj containing (sorted): ",] s = ["DataStorage obj containing (sorted): ",]
for k in keys: for k in keys:
if isinstance(self[k],np.ndarray): obj = self[k]
value_str = "array, size %s, type %s"% ("x".join(map(str,self[k].shape)),self[k].dtype) if isinstance(obj,np.ndarray):
elif isinstance(self[k],DataStorage): value_str = "array, size %s, type %s"% ("x".join(map(str,obj.shape)),obj.dtype)
value_str = str(self[k])[:50] + "..." elif isinstance(obj,DataStorage):
elif isinstance(self[k],(str,DataStorage)): value_str = str(obj)[:50]
value_str = self[k][:50] + "..." elif isinstance(obj,(str,DataStorage)):
value_str = obj[:50]
elif isinstance(obj,(list,tuple)) and all( [isinstance(v,np.ndarray) for v in obj]):
value_str = "list of arrays, shapes " + ",".join([str(v.shape) for v in obj[:5]]) + " ..."
elif self[k] is None: elif self[k] is None:
value_str = "None" value_str = "None"
else: else:
value_str = str(self[k]) value_str = str(self[k])
if len(str(obj))>50: value_str += " ..."
s.append( fmt % (k,value_str) ) s.append( fmt % (k,value_str) )
return "\n".join(s) return "\n".join(s)
def keys(self):
keys = list(super().keys())
keys = [k for k in keys if k != 'filename' ]
return keys
def save(self,fname=None): def save(self,fname=None):
if fname is None: fname = self.filename if fname is None: fname = self.filename
assert fname is not None assert fname is not None