Skip to content

Commit d67b040

Browse files
author
Ralf W. Grosse-Kunstleve
committed
fixes to support pickling of enums (by Shashank Bapat)
[SVN r36256]
1 parent 2db6165 commit d67b040

2 files changed

Lines changed: 20 additions & 7 deletions

File tree

src/object/enum.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,19 @@ extern "C"
3232
{
3333
static PyObject* enum_repr(PyObject* self_)
3434
{
35+
const char *mod = PyString_AsString(PyObject_GetAttrString( self_, "__module__"));
3536
enum_object* self = downcast<enum_object>(self_);
3637
if (!self->name)
3738
{
38-
return PyString_FromFormat("%s(%ld)", self_->ob_type->tp_name, PyInt_AS_LONG(self_));
39+
return PyString_FromFormat("%s.%s(%ld)", mod, self_->ob_type->tp_name, PyInt_AS_LONG(self_));
3940
}
4041
else
4142
{
4243
char* name = PyString_AsString(self->name);
4344
if (name == 0)
4445
return 0;
4546

46-
return PyString_FromFormat("%s.%s", self_->ob_type->tp_name, name);
47+
return PyString_FromFormat("%s.%s.%s", mod, self_->ob_type->tp_name, name);
4748
}
4849
}
4950

@@ -141,10 +142,9 @@ namespace
141142

142143
object module_name = module_prefix();
143144
if (module_name)
144-
module_name += '.';
145+
d["__module__"] = module_name;
145146

146-
object result = (object(metatype))(
147-
module_name + name, make_tuple(base), d);
147+
object result = (object(metatype))(name, make_tuple(base), d);
148148

149149
scope().attr(name) = result;
150150

test/enum.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,27 @@
4848
enum_ext.color.green
4949
'''
5050

51+
# pickling of enums only works with Python 2.3 or higher
52+
exercise_pickling = '''
53+
>>> import pickle
54+
>>> p = pickle.dumps(color.green, pickle.HIGHEST_PROTOCOL)
55+
>>> l = pickle.loads(p)
56+
>>> identity(l)
57+
enum_ext.color.green
58+
'''
59+
5160
def run(args = None):
5261
import sys
5362
import doctest
63+
import pickle
5464

5565
if args is not None:
5666
sys.argv = args
57-
return doctest.testmod(sys.modules.get(__name__))
58-
67+
self = sys.modules.get(__name__)
68+
if (hasattr(pickle, "HIGHEST_PROTOCOL")):
69+
self.__doc__ += exercise_pickling
70+
return doctest.testmod(self)
71+
5972
if __name__ == '__main__':
6073
print "running..."
6174
import sys

0 commit comments

Comments
 (0)