Initial revision
diff --git a/Lib/dump.py b/Lib/dump.py
new file mode 100644
index 0000000..cecc275
--- /dev/null
+++ b/Lib/dump.py
@@ -0,0 +1,63 @@
+# 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