# 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
