blob: 60bdba8cebe9687ad0ceddf9ef79ea8e12d3f38a [file] [log] [blame]
# 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