"""
This example shows how to create intermediate groups with a single call to
h5py.h5g.create.
"""
import sys

import numpy as np
import h5py

FILE = "h5ex_g_intermediate.h5"
GROUP = "/G1/G2/G3"

# Strings are handled very differently between python2 and python3.
if sys.hexversion >= 0x03000000:
    FILE = FILE.encode()
    GROUP = GROUP.encode()

def run():

    # Create a new file using the default properties.
    fid = h5py.h5f.create(FILE)

    # Create group creation property list and set it to allow creation of
    # intermediate groups.
    gcpl = h5py.h5p.create(h5py.h5p.LINK_CREATE)
    gcpl.set_create_intermediate_group(True)

    # Create a group named "G1" in the file.
    group = h5py.h5g.create(fid, GROUP, gcpl)

    # Print all the objects in the file to show that intermediate groups
    # have been created.
    print("\nObjects in the file:")
    h5py.h5o.visit(fid, op_func, info=True)

    # Close the group.  The handle "group" can no longer be used.
    del gcpl
    del group
    del fid

def op_func(name, info):

    # Let's prepend with a leading slash, just so we have the full path.
    if info.type == h5py.h5o.TYPE_GROUP:
        fmt = "/%s (Group)"
    elif info.type == h5py.h5o.TYPE_DATASET:
        fmt = "/%s (Dataset)"
    elif info.type == h5py.h5o.TYPE_NAMED_DATATYPE:
        fmt = "/%s (Datatype)"
    else:
        fmt = "/%s (Unknown)"
    print( fmt % name.decode('utf-8'))

if __name__ == "__main__":
    run()        
