mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +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
 |