mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.
This commit is contained in:
		
							parent
							
								
									9eec51c04f
								
							
						
					
					
						commit
						07529354db
					
				
					 4 changed files with 33 additions and 4 deletions
				
			
		|  | @ -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 @@ def test_bug_1164912 (self): | |||
|         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 @@ def __dump(self, value, write): | |||
|         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): | ||||
|  |  | |||
|  | @ -101,6 +101,9 @@ Core and builtins | |||
| Library | ||||
| ------- | ||||
| 
 | ||||
| - Patch #1070046: Marshal new-style objects like InstanceType | ||||
|   in xmlrpclib. | ||||
| 
 | ||||
| - cStringIO.truncate(-1) now raises an IOError, like StringIO and | ||||
|   regular files. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Martin v. Löwis
						Martin v. Löwis