| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # 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) | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 	if t == type({}): | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		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` | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 	elif t == type(sys): | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		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 | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 	if x == {}: | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 		return 1 | 
					
						
							|  |  |  | 	return 0 |