mirror of
https://github.com/boostorg/python.git
synced 2026-01-20 04:42:28 +00:00
fixes to support pickling of enums (by Shashank Bapat)
[SVN r36256]
This commit is contained in:
@@ -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<enum_object>(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;
|
||||
|
||||
|
||||
17
test/enum.py
17
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
|
||||
|
||||
Reference in New Issue
Block a user