def pyobj_to_hdf(pyobj, hdf=None): def make_key(lst): return '.'.join([str(i) for i in lst]) def process_value(value, current_key, hdf): if isinstance(value, list): for idx, item in enumerate(value): process_value(item, current_key + [idx], hdf) elif isinstance(value, dict): for key, item in value.iteritems(): process_value(item, current_key + [key], hdf) elif isinstance(value, str): hdf.setValue(make_key(current_key), value) else: hdf.setValue(make_key(current_key), str(value)) if not hdf: hdf = HDF() process_value(pyobj, [], hdf) return hdf
def hdfFromKwargs(hdf=None, **kwargs): """If given an instance that has toHDF() method that method is invoked to get that object's HDF representation""" if not hdf: hdf = HDF() for key, value in kwargs.iteritems(): if isinstance(value, dict): #print "dict:",value for k,v in value.iteritems(): dkey = "%s.%s"%(key,k) #print "k,v,dkey:",k,v,dkey args = {dkey:v} hdfFromKwargs(hdf=hdf, **args) elif isinstance(value, (list, tuple)): #print "list:",value for i, item in enumerate(value): ikey = "%s.%s"%(key,i) #print "i,item:",i,item, ikey if isinstance(item, (list, tuple)): args = {ikey:item} hdfFromKwargs(hdf=hdf, **args) elif isinstance(item, dict): args = {ikey:item} hdfFromKwargs(hdf=hdf, **args) elif getattr(item, "HDF_ATTRIBUTES", False): attrs = {} for attr in item.HDF_ATTRIBUTES: attrs[attr] = getattr(item, attr, "") hdfFromKwargs(hdf=hdf, **{ikey:attrs}) else: hdf.setValue(ikey, str(item)) elif getattr(value, "HDF_ATTRIBUTES", False): attrs = {} for attr in value.HDF_ATTRIBUTES: attrs[attr] = getattr(value, attr, "") hdfFromKwargs(hdf=hdf, **{key:attrs}) else: hdf.setValue(key, str(value)) #print "HDF:",hdf.dump() return hdf