Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.
This commit is contained in:
parent
9eec51c04f
commit
07529354db
|
@ -68,7 +68,10 @@ Python type):
|
|||
\lineii{arrays}{Any Python sequence type containing conformable
|
||||
elements. Arrays are returned as lists}
|
||||
\lineii{structures}{A Python dictionary. Keys must be strings,
|
||||
values may be any conformable type.}
|
||||
values may be any conformable type. Objects
|
||||
of user-defined classes can be passed in;
|
||||
only their \var{__dict__} attribute is
|
||||
transmitted.}
|
||||
\lineii{dates}{in seconds since the epoch (pass in an instance of the
|
||||
\class{DateTime} class) or a
|
||||
\class{\refmodule{datetime}.datetime},
|
||||
|
@ -100,6 +103,10 @@ described below.
|
|||
compatibility. New code should use \class{ServerProxy}.
|
||||
|
||||
\versionchanged[The \var{use_datetime} flag was added]{2.5}
|
||||
|
||||
\versionchanged[Instances of new-style classes can be passed in
|
||||
if they have an \var{__dict__} attribute and don't have a base class
|
||||
that is marshalled in a special way.}{2.6}
|
||||
\end{classdesc}
|
||||
|
||||
|
||||
|
|
|
@ -86,6 +86,15 @@ class XMLRPCTestCase(unittest.TestCase):
|
|||
s = xmlrpclib.dumps((new_d,), methodresponse=True)
|
||||
self.assert_(isinstance(s, str))
|
||||
|
||||
def test_newstyle_class(self):
|
||||
class T(object):
|
||||
pass
|
||||
t = T()
|
||||
t.x = 100
|
||||
t.y = "Hello"
|
||||
((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
|
||||
self.assertEquals(t2, t.__dict__)
|
||||
|
||||
def test_dump_big_long(self):
|
||||
self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,))
|
||||
|
||||
|
|
|
@ -630,8 +630,18 @@ class Marshaller:
|
|||
try:
|
||||
f = self.dispatch[type(value)]
|
||||
except KeyError:
|
||||
# check if this object can be marshalled as a structure
|
||||
try:
|
||||
value.__dict__
|
||||
except:
|
||||
raise TypeError, "cannot marshal %s objects" % type(value)
|
||||
else:
|
||||
# check if this class is a sub-class of a basic type,
|
||||
# because we don't know how to marshal these types
|
||||
# (e.g. a string sub-class)
|
||||
for type_ in type(value).__mro__:
|
||||
if type_ in self.dispatch.keys():
|
||||
raise TypeError, "cannot marshal %s objects" % type(value)
|
||||
f = self.dispatch[InstanceType]
|
||||
f(self, value, write)
|
||||
|
||||
def dump_nil (self, value, write):
|
||||
|
|
Loading…
Reference in New Issue