| # 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 |