[Python-checkins] r52790 - in python/trunk: Doc/lib/libxmlrpclib.tex Lib/test/test_xmlrpc.py Lib/xmlrpclib.py Misc/NEWS

martin.v.loewis python-checkins at python.org
Sun Nov 19 19:51:55 CET 2006


Author: martin.v.loewis
Date: Sun Nov 19 19:51:54 2006
New Revision: 52790
Modified:
 python/trunk/Doc/lib/libxmlrpclib.tex
 python/trunk/Lib/test/test_xmlrpc.py
 python/trunk/Lib/xmlrpclib.py
 python/trunk/Misc/NEWS
Log:
Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.
Modified: python/trunk/Doc/lib/libxmlrpclib.tex
==============================================================================
--- python/trunk/Doc/lib/libxmlrpclib.tex	(original)
+++ python/trunk/Doc/lib/libxmlrpclib.tex	Sun Nov 19 19:51:54 2006
@@ -68,7 +68,10 @@
 \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 @@
 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}
 
 
Modified: python/trunk/Lib/test/test_xmlrpc.py
==============================================================================
--- python/trunk/Lib/test/test_xmlrpc.py	(original)
+++ python/trunk/Lib/test/test_xmlrpc.py	Sun Nov 19 19:51:54 2006
@@ -86,6 +86,15 @@
 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,))
 
Modified: python/trunk/Lib/xmlrpclib.py
==============================================================================
--- python/trunk/Lib/xmlrpclib.py	(original)
+++ python/trunk/Lib/xmlrpclib.py	Sun Nov 19 19:51:54 2006
@@ -630,9 +630,19 @@
 try:
 f = self.dispatch[type(value)]
 except KeyError:
- raise TypeError, "cannot marshal %s objects" % type(value)
- else:
- f(self, value, write)
+ # check if this object can be marshalled as a structure
+ try:
+ value.__dict__
+ except:
+ raise TypeError, "cannot marshal %s objects" % type(value)
+ # 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):
 if not self.allow_none:
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sun Nov 19 19:51:54 2006
@@ -101,6 +101,9 @@
 Library
 -------
 
+- Patch #1070046: Marshal new-style objects like InstanceType
+ in xmlrpclib.
+
 - cStringIO.truncate(-1) now raises an IOError, like StringIO and
 regular files.
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /