[Python-checkins] python/nondist/sandbox/pickletools pickletools.py,1.17,1.18
tim_one@users.sourceforge.net
tim_one@users.sourceforge.net
Sun, 26 Jan 2003 09:29:49 -0800
Update of /cvsroot/python/python/nondist/sandbox/pickletools
In directory sc8-pr-cvs1:/tmp/cvs-serv12022
Modified Files:
pickletools.py
Log Message:
Ensure this module is defiing the same opcode names, with the same opcode
codes, as pickle.py.
Index: pickletools.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/pickletools/pickletools.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** pickletools.py 26 Jan 2003 16:10:46 -0000 1.17
--- pickletools.py 26 Jan 2003 17:29:46 -0000 1.18
***************
*** 1256,1259 ****
--- 1256,1310 ----
del name2i, code2i, i, d
+ ##############################################################################
+ # Build a code2op dict, mapping opcode characters to OpcodeInfo records.
+ # Also ensure we've got the same stuff as pickle.py, although the
+ # introspection here is dicey.
+
+ code2op = {}
+ for d in opcodes:
+ code2op[d.code] = d
+ del d
+
+ def assure_pickle_consistency(verbose=False):
+ import pickle, re
+
+ copy = code2op.copy()
+ for name in pickle.__all__:
+ if not re.match("[A-Z][A-Z0-9_]+$", name):
+ if verbose:
+ print "skipping %r: it doesn't look like an opcode name" % name
+ continue
+ picklecode = getattr(pickle, name)
+ if not isinstance(picklecode, str) or len(picklecode) != 1:
+ if verbose:
+ print ("skipping %r: value %r doesn't look like a pickle "
+ "code" % (name, picklecode))
+ continue
+ if picklecode in copy:
+ if verbose:
+ print "checking name %r w/ code %r for consistency" % (
+ name, picklecode)
+ d = copy[picklecode]
+ if d.name != name:
+ raise ValueError("for pickle code %r, pickle.py uses name %r "
+ "but we're using name %r" % (picklecode,
+ name,
+ d.name))
+ # Forget this one. Any left over in copy at the end are a problem
+ # of a different kind.
+ del copy[picklecode]
+ else:
+ raise ValueError("pickle.py appears to have a pickle opcode with "
+ "name %r and code %r, but we don't" %
+ (name, picklecode))
+ if copy:
+ msg = ["we appear to have pickle opcodes that pickle.py doesn't have:"]
+ for code, d in copy.items():
+ msg.append(" name %r with code %r" % (d.name, code))
+ raise ValueError("\n".join(msg))
+
+ assure_pickle_consistency()
+
+
def _test():
import doctest