[Python-Dev] Pickling objects that return string from reduce
Bruce Christensen
t-bruch at microsoft.com
Mon Jul 17 22:14:36 CEST 2006
I'm still plugging away on IronPython's cPickle, and I've stumbled
across another ambiguity in the pickle docs. From
http://docs.python.org/lib/node69.html:
"If a string is returned, it names a global variable whose contents are
pickled as normal. The string returned by __reduce__ should be the
object's local name relative to its module; the pickle module searches
the module namespace to determine the object's module."
What exactly does that last clause mean? Must the object have a
__module__ attribute? What if it doesn't? What if the module exists but
isn't currently imported?
Is something like the following close?
# Call copy_reg-registered func, obj.__reduce_ex__, or
obj.__reduce__
result = call_reduce(obj)
if type(result) == tuple:
... (do appropriate things here)
elif isinstance(result, basestring):
name = result
module = "<unknown module>"
try:
module = obj.__module__
found_obj = getattr(sys.modules[module], name)
except AttributeError, KeyError:
raise PicklingError(
"Can't pickle %r: it's not found as %s.%s"
% (obj, module, name)
)
if found_obj is not obj:
raise PicklingError(
"Can't pickle %r: it's not the same object as %s.%s"
% (obj, module, name)
)
emit("c%s\n%s\n" % module, name)
Thanks,
--Bruce
More information about the Python-Dev
mailing list