mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 05:01:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			63 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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
 | 
