| # 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 |