(optional) tip:  Name "same stuff" with the same names, so for example:

    rand_data = self.sub_stuff["rand_data"] = rand_str(5)

It's minimal extra typing, but when things break it makes debugging a LOT easier - Especially since python is pass-by-reference, it's easy to forget mutables share the same "stuff".  e.g.:

    foo = self.sub_stuff["bar"] = {"woops":"foo == bar"}
    ...
    foo['something'] = 'one tihng'
    ...
    bar = self.sub_stuff["bar"]
    bar['something'] = 'another thing'  #  woops, just clobbered foo!