# Module 'dump'
#
# Print python code that reconstructs a variable.
# This only works in certain cases.
#
# It works fine for:
# - ints and floats (except NaNs and other weird things)
# - strings
# - compounds and lists, provided it works for all their elements
# - imported modules, provided their name is the module name
#
# It works for top-level dictionaries but not for dictionaries
# contained in other objects (could be made to work with some hassle
# though).
#
# It does not work for functions (all sorts), classes, class objects,
# windows, files etc.
#
# Finally, objects referenced by more than one name or contained in more
# than one other object lose their sharing property (this is bad for
# strings used as exception identifiers, for instance).

# Dump a whole symbol table
#
def dumpsymtab(dict):
    for key in dict.keys():
        dumpvar(key, dict[key])

# Dump a single variable
#
def dumpvar(name, x):
    import sys
    t = type(x)
    if t == type({}):
        print name, '= {}'
        for key in x.keys():
            item = x[key]
            if not printable(item):
                print '#',
            print name, '[', `key`, '] =', `item`
    elif t in (type(''), type(0), type(0.0), type([]), type(())):
        if not printable(x):
            print '#',
        print name, '=', `x`
    elif t == type(sys):
        print 'import', name, '#', x
    else:
        print '#', name, '=', x

# check if a value is printable in a way that can be read back with input()
#
def printable(x):
    t = type(x)
    if t in (type(''), type(0), type(0.0)):
        return 1
    if t in (type([]), type(())):
        for item in x:
            if not printable(item):
                return 0
        return 1
    if x == {}:
        return 1
    return 0
