mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	Subclasses of int/long are allowed to define an __index__.
This commit is contained in:
		
							parent
							
								
									6e482569c8
								
							
						
					
					
						commit
						271a8689e9
					
				
					 2 changed files with 11 additions and 12 deletions
				
			
		|  | @ -48,11 +48,12 @@ def test_wrappers(self): | ||||||
|         self.assertEqual(self.o.__index__(), 4) |         self.assertEqual(self.o.__index__(), 4) | ||||||
|         self.assertEqual(self.n.__index__(), 5) |         self.assertEqual(self.n.__index__(), 5) | ||||||
| 
 | 
 | ||||||
|     def test_infinite_recursion(self): |     def test_subclasses(self): | ||||||
|         self.failUnlessRaises(TypeError, operator.index, TrapInt()) |         r = range(10) | ||||||
|         self.failUnlessRaises(TypeError, operator.index, TrapLong()) |         self.assertEqual(r[TrapInt(5):TrapInt(10)], r[5:10]) | ||||||
|         self.failUnless(slice(TrapInt()).indices(0)==(0,0,1)) |         self.assertEqual(r[TrapLong(5):TrapLong(10)], r[5:10]) | ||||||
|         self.failUnlessRaises(TypeError, slice(TrapLong()).indices, 0) |         self.assertEqual(slice(TrapInt()).indices(0), (0,0,1)) | ||||||
|  |         self.assertEqual(slice(TrapLong(0)).indices(0), (0,0,1)) | ||||||
| 
 | 
 | ||||||
|     def test_error(self): |     def test_error(self): | ||||||
|         self.o.ind = 'dumb' |         self.o.ind = 'dumb' | ||||||
|  | @ -104,9 +105,9 @@ def test_wrappers(self): | ||||||
|         self.assertEqual(self.seq.__mul__(self.n), self.seq * 5) |         self.assertEqual(self.seq.__mul__(self.n), self.seq * 5) | ||||||
|         self.assertEqual(self.seq.__rmul__(self.n), self.seq * 5) |         self.assertEqual(self.seq.__rmul__(self.n), self.seq * 5) | ||||||
| 
 | 
 | ||||||
|     def test_infinite_recursion(self): |     def test_subclasses(self): | ||||||
|         self.failUnlessRaises(TypeError, operator.getitem, self.seq, TrapInt()) |         self.assertEqual(self.seq[TrapInt()], self.seq[0]) | ||||||
|         self.failUnlessRaises(TypeError, operator.getitem, self.seq, TrapLong()) |         self.assertEqual(self.seq[TrapLong()], self.seq[0]) | ||||||
| 
 | 
 | ||||||
|     def test_error(self): |     def test_error(self): | ||||||
|         self.o.ind = 'dumb' |         self.o.ind = 'dumb' | ||||||
|  |  | ||||||
|  | @ -945,16 +945,14 @@ PyNumber_Index(PyObject *item) | ||||||
| 	PyObject *result = NULL; | 	PyObject *result = NULL; | ||||||
| 	if (item == NULL) | 	if (item == NULL) | ||||||
| 		return null_error(); | 		return null_error(); | ||||||
| 	/* XXX(nnorwitz): should these be CheckExact?  Aren't subclasses ok? */ | 	if (PyInt_Check(item) || PyLong_Check(item)) { | ||||||
| 	if (PyInt_CheckExact(item) || PyLong_CheckExact(item)) { |  | ||||||
| 		Py_INCREF(item); | 		Py_INCREF(item); | ||||||
| 		return item; | 		return item; | ||||||
| 	} | 	} | ||||||
| 	if (PyIndex_Check(item)) { | 	if (PyIndex_Check(item)) { | ||||||
| 		result = item->ob_type->tp_as_number->nb_index(item); | 		result = item->ob_type->tp_as_number->nb_index(item); | ||||||
| 		/* XXX(nnorwitz): Aren't subclasses ok here too? */ |  | ||||||
| 		if (result && | 		if (result && | ||||||
| 		    !PyInt_CheckExact(result) && !PyLong_CheckExact(result)) { | 		    !PyInt_Check(result) && !PyLong_Check(result)) { | ||||||
| 			PyErr_Format(PyExc_TypeError, | 			PyErr_Format(PyExc_TypeError, | ||||||
| 				     "__index__ returned non-(int,long) " \ | 				     "__index__ returned non-(int,long) " \ | ||||||
| 				     "(type %.200s)", | 				     "(type %.200s)", | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neal Norwitz
						Neal Norwitz