Solution 1. The class provides the transformation into a dict of hdf-compliant objects


The object which can be reduced to and reconstructed from a dictionary whose keys are strings, and whose values are of one of the following types:

  • a scalar (int, float, complex ….)
  • a numpy array of scalars
  • an hdf-compliant object
  • a list, a tuple or a dict of any of the types above.

A class cls has to implement :


Returns a dictionary of objects implementing hdf-compliant or basic objects as number, strings, and arrays of numbers (any type and shape).

Return type:a dictionary
__factory_from_dict__(cls,name,D) :

A classmethod which reconstructs a new object of type cls from the dictionary returned by __reduce_to_dict__().

  • cls – the class
  • name – the attribute of the class
  • D – the dictionary returned by __reduce_to_dict__.
Return type:

a new object of type cls


A little example:

class Example:

   def __init__(self,d,t):
       self.d,self.t = d,t # some data

   def __reduce_to_dict__(self):
       return {'d': self.d, 't': self.t}

   def __factory_from_dict__(cls,name,D) :
       return cls(D['d'],D['t'])

# registering my class
from h5.formats import register_class
register_class (myclass)

# Testing it:
HDFArchive("myfile2.h5")['e'] = Example( [1,2,3], 56)

What happens in details ?

Let us consider an object Ob of class Cls, interacting with and HDFArchive/HDFArchiveGroup H.

  • Writing

    H[Name] = Ob
    • a subgroup S of path Root_of_H/Name is created.
    • Ob.__reduce_to_dict__() is called and returns a dictionary D of scalar/numpy arrays/hdf-compliant objects.
    • The objects in D are then stored S in a regular way (scalar/arrays) or using the same recursive procedure (other objects).
    • S is tagged with the attribute HDF5_data_scheme of Cls.
  • Reading

    res = H[Name]
    • The subgroup S of path Root_of_H/Name is explored. All objects are taken to build a dictionary D: name -> values. This procedure is recursive: the hdf-compliant objects in the subgroup are rebuilt.

    • An attribute HDF5_data_scheme is searched for S.

      • If it is found and it corresponds to a registered class Cls :
        • Cls.__factory_from_dict__(name,D) is called and returns a new object Obj of type Cls, which is returned as res.
      • Otherwise, a new HDFArchiveGroup is constructed with S as root, and returned as res.