From d67b0406834da38bb561dfd963c16b25d07a54ef Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Sun, 3 Dec 2006 20:43:48 +0000 Subject: [PATCH] fixes to support pickling of enums (by Shashank Bapat) [SVN r36256] --- src/object/enum.cpp | 10 +++++----- test/enum.py | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/object/enum.cpp b/src/object/enum.cpp index a96cc819..1973270b 100644 --- a/src/object/enum.cpp +++ b/src/object/enum.cpp @@ -32,10 +32,11 @@ extern "C" { static PyObject* enum_repr(PyObject* self_) { + const char *mod = PyString_AsString(PyObject_GetAttrString( self_, "__module__")); enum_object* self = downcast(self_); if (!self->name) { - return PyString_FromFormat("%s(%ld)", self_->ob_type->tp_name, PyInt_AS_LONG(self_)); + return PyString_FromFormat("%s.%s(%ld)", mod, self_->ob_type->tp_name, PyInt_AS_LONG(self_)); } else { @@ -43,7 +44,7 @@ extern "C" if (name == 0) return 0; - return PyString_FromFormat("%s.%s", self_->ob_type->tp_name, name); + return PyString_FromFormat("%s.%s.%s", mod, self_->ob_type->tp_name, name); } } @@ -141,10 +142,9 @@ namespace object module_name = module_prefix(); if (module_name) - module_name += '.'; + d["__module__"] = module_name; - object result = (object(metatype))( - module_name + name, make_tuple(base), d); + object result = (object(metatype))(name, make_tuple(base), d); scope().attr(name) = result; diff --git a/test/enum.py b/test/enum.py index 27f09322..b78160ec 100644 --- a/test/enum.py +++ b/test/enum.py @@ -48,14 +48,27 @@ enum_ext.color.red enum_ext.color.green ''' +# pickling of enums only works with Python 2.3 or higher +exercise_pickling = ''' +>>> import pickle +>>> p = pickle.dumps(color.green, pickle.HIGHEST_PROTOCOL) +>>> l = pickle.loads(p) +>>> identity(l) +enum_ext.color.green +''' + def run(args = None): import sys import doctest + import pickle if args is not None: sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - + self = sys.modules.get(__name__) + if (hasattr(pickle, "HIGHEST_PROTOCOL")): + self.__doc__ += exercise_pickling + return doctest.testmod(self) + if __name__ == '__main__': print "running..." import sys