mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Remove the ability to slice/index on exceptions per PEP 352.
This commit is contained in:
		
							parent
							
								
									44c526174d
								
							
						
					
					
						commit
						ba7bf49a54
					
				
					 8 changed files with 16 additions and 46 deletions
				
			
		|  | @ -569,7 +569,7 @@ def _interpolate(self, section, option, rawval, vars): | ||||||
|                     value = value % vars |                     value = value % vars | ||||||
|                 except KeyError as e: |                 except KeyError as e: | ||||||
|                     raise InterpolationMissingOptionError( |                     raise InterpolationMissingOptionError( | ||||||
|                         option, section, rawval, e[0]) |                         option, section, rawval, e.message) | ||||||
|             else: |             else: | ||||||
|                 break |                 break | ||||||
|         if "%(" in value: |         if "%(" in value: | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ def cleanup(): | ||||||
|         try: |         try: | ||||||
|             os.unlink(filename + suffix) |             os.unlink(filename + suffix) | ||||||
|         except OSError as e: |         except OSError as e: | ||||||
|             (errno, strerror) = e |             (errno, strerror) = e.errno, e.strerror | ||||||
|             # if we can't delete the file because of permissions, |             # if we can't delete the file because of permissions, | ||||||
|             # nothing will work, so skip the test |             # nothing will work, so skip the test | ||||||
|             if errno == 1: |             if errno == 1: | ||||||
|  |  | ||||||
|  | @ -302,13 +302,6 @@ def testAttributes(self): | ||||||
|                                               'pickled "%r", attribute "%s' % |                                               'pickled "%r", attribute "%s' % | ||||||
|                                               (e, checkArgName)) |                                               (e, checkArgName)) | ||||||
| 
 | 
 | ||||||
|     def testSlicing(self): |  | ||||||
|         # Test that you can slice an exception directly instead of requiring |  | ||||||
|         # going through the 'args' attribute. |  | ||||||
|         args = (1, 2, 3) |  | ||||||
|         exc = BaseException(*args) |  | ||||||
|         self.failUnlessEqual(exc[:], args) |  | ||||||
| 
 |  | ||||||
|     def testKeywordArgs(self): |     def testKeywordArgs(self): | ||||||
|         # test that builtin exception don't take keyword args, |         # test that builtin exception don't take keyword args, | ||||||
|         # but user-defined subclasses can if they want |         # but user-defined subclasses can if they want | ||||||
|  |  | ||||||
|  | @ -156,7 +156,7 @@ def testBadModeArgument(self): | ||||||
|         try: |         try: | ||||||
|             f = open(TESTFN, bad_mode) |             f = open(TESTFN, bad_mode) | ||||||
|         except ValueError as msg: |         except ValueError as msg: | ||||||
|             if msg[0] != 0: |             if msg.message != 0: | ||||||
|                 s = str(msg) |                 s = str(msg) | ||||||
|                 if s.find(TESTFN) != -1 or s.find(bad_mode) == -1: |                 if s.find(TESTFN) != -1 or s.find(bad_mode) == -1: | ||||||
|                     self.fail("bad error message for invalid mode: %s" % s) |                     self.fail("bad error message for invalid mode: %s" % s) | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ def test_builtins_new_style(self): | ||||||
|         self.failUnless(issubclass(Exception, object)) |         self.failUnless(issubclass(Exception, object)) | ||||||
| 
 | 
 | ||||||
|     def verify_instance_interface(self, ins): |     def verify_instance_interface(self, ins): | ||||||
|         for attr in ("args", "message", "__str__", "__repr__", "__getitem__"): |         for attr in ("args", "message", "__str__", "__repr__"): | ||||||
|             self.failUnless(hasattr(ins, attr), "%s missing %s attribute" % |             self.failUnless(hasattr(ins, attr), "%s missing %s attribute" % | ||||||
|                     (ins.__class__.__name__, attr)) |                     (ins.__class__.__name__, attr)) | ||||||
| 
 | 
 | ||||||
|  | @ -72,8 +72,7 @@ def test_inheritance(self): | ||||||
|             inheritance_tree.close() |             inheritance_tree.close() | ||||||
|         self.failUnlessEqual(len(exc_set), 0, "%s not accounted for" % exc_set) |         self.failUnlessEqual(len(exc_set), 0, "%s not accounted for" % exc_set) | ||||||
| 
 | 
 | ||||||
|     interface_tests = ("length", "args", "message", "str", "unicode", "repr", |     interface_tests = ("length", "args", "message", "str", "unicode", "repr") | ||||||
|             "indexing") |  | ||||||
| 
 | 
 | ||||||
|     def interface_test_driver(self, results): |     def interface_test_driver(self, results): | ||||||
|         for test_name, (given, expected) in zip(self.interface_tests, results): |         for test_name, (given, expected) in zip(self.interface_tests, results): | ||||||
|  | @ -86,7 +85,7 @@ def test_interface_single_arg(self): | ||||||
|         exc = Exception(arg) |         exc = Exception(arg) | ||||||
|         results = ([len(exc.args), 1], [exc.args[0], arg], [exc.message, arg], |         results = ([len(exc.args), 1], [exc.args[0], arg], [exc.message, arg], | ||||||
|                 [str(exc), str(arg)], [unicode(exc), unicode(arg)], |                 [str(exc), str(arg)], [unicode(exc), unicode(arg)], | ||||||
|             [repr(exc), exc.__class__.__name__ + repr(exc.args)], [exc[0], arg]) |             [repr(exc), exc.__class__.__name__ + repr(exc.args)]) | ||||||
|         self.interface_test_driver(results) |         self.interface_test_driver(results) | ||||||
| 
 | 
 | ||||||
|     def test_interface_multi_arg(self): |     def test_interface_multi_arg(self): | ||||||
|  | @ -97,8 +96,7 @@ def test_interface_multi_arg(self): | ||||||
|         results = ([len(exc.args), arg_count], [exc.args, args], |         results = ([len(exc.args), arg_count], [exc.args, args], | ||||||
|                 [exc.message, ''], [str(exc), str(args)], |                 [exc.message, ''], [str(exc), str(args)], | ||||||
|                 [unicode(exc), unicode(args)], |                 [unicode(exc), unicode(args)], | ||||||
|                 [repr(exc), exc.__class__.__name__ + repr(exc.args)], |                 [repr(exc), exc.__class__.__name__ + repr(exc.args)]) | ||||||
|                 [exc[-1], args[-1]]) |  | ||||||
|         self.interface_test_driver(results) |         self.interface_test_driver(results) | ||||||
| 
 | 
 | ||||||
|     def test_interface_no_arg(self): |     def test_interface_no_arg(self): | ||||||
|  | @ -106,7 +104,7 @@ def test_interface_no_arg(self): | ||||||
|         exc = Exception() |         exc = Exception() | ||||||
|         results = ([len(exc.args), 0], [exc.args, tuple()], [exc.message, ''], |         results = ([len(exc.args), 0], [exc.args, tuple()], [exc.message, ''], | ||||||
|                 [str(exc), ''], [unicode(exc), u''], |                 [str(exc), ''], [unicode(exc), u''], | ||||||
|                 [repr(exc), exc.__class__.__name__ + '()'], [True, True]) |                 [repr(exc), exc.__class__.__name__ + '()']) | ||||||
|         self.interface_test_driver(results) |         self.interface_test_driver(results) | ||||||
| 
 | 
 | ||||||
| class UsageTests(unittest.TestCase): | class UsageTests(unittest.TestCase): | ||||||
|  | @ -166,6 +164,10 @@ class NonBaseException(object): | ||||||
|         self.catch_fails(NonBaseException) |         self.catch_fails(NonBaseException) | ||||||
|         self.catch_fails(NonBaseException()) |         self.catch_fails(NonBaseException()) | ||||||
| 
 | 
 | ||||||
|  |     def test_catch_BaseException_instance(self): | ||||||
|  |         # Catching an instance of a BaseException subclass won't work. | ||||||
|  |         self.catch_fails(BaseException()) | ||||||
|  | 
 | ||||||
|     def test_catch_string(self): |     def test_catch_string(self): | ||||||
|         # Catching a string is bad. |         # Catching a string is bad. | ||||||
|         self.catch_fails("spam") |         self.catch_fails("spam") | ||||||
|  |  | ||||||
|  | @ -178,7 +178,7 @@ def format_exception_only(etype, value): | ||||||
|     # It was a syntax error; show exactly where the problem was found. |     # It was a syntax error; show exactly where the problem was found. | ||||||
|     lines = [] |     lines = [] | ||||||
|     try: |     try: | ||||||
|         msg, (filename, lineno, offset, badline) = value |         msg, (filename, lineno, offset, badline) = value.args | ||||||
|     except Exception: |     except Exception: | ||||||
|         pass |         pass | ||||||
|     else: |     else: | ||||||
|  |  | ||||||
|  | @ -28,6 +28,8 @@ TO DO | ||||||
| Core and Builtins | Core and Builtins | ||||||
| ----------------- | ----------------- | ||||||
| 
 | 
 | ||||||
|  | - Removing indexing/slicing on BaseException. | ||||||
|  | 
 | ||||||
| - Remove the exceptions module, all the exceptions are already builtin. | - Remove the exceptions module, all the exceptions are already builtin. | ||||||
| 
 | 
 | ||||||
| - input() becomes raw_input(): the name input() now implements the | - input() becomes raw_input(): the name input() now implements the | ||||||
|  |  | ||||||
|  | @ -174,33 +174,6 @@ static PyMethodDef BaseException_methods[] = { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| static PyObject * |  | ||||||
| BaseException_getitem(PyBaseExceptionObject *self, Py_ssize_t index) |  | ||||||
| { |  | ||||||
|     return PySequence_GetItem(self->args, index); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static PyObject * |  | ||||||
| BaseException_getslice(PyBaseExceptionObject *self, |  | ||||||
| 			Py_ssize_t start, Py_ssize_t stop) |  | ||||||
| { |  | ||||||
|     return PySequence_GetSlice(self->args, start, stop); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static PySequenceMethods BaseException_as_sequence = { |  | ||||||
|     0,                      /* sq_length; */ |  | ||||||
|     0,                      /* sq_concat; */ |  | ||||||
|     0,                      /* sq_repeat; */ |  | ||||||
|     (ssizeargfunc)BaseException_getitem,  /* sq_item; */ |  | ||||||
|     (ssizessizeargfunc)BaseException_getslice,  /* sq_slice; */ |  | ||||||
|     0,                      /* sq_ass_item; */ |  | ||||||
|     0,                      /* sq_ass_slice; */ |  | ||||||
|     0,                      /* sq_contains; */ |  | ||||||
|     0,                      /* sq_inplace_concat; */ |  | ||||||
|     0                       /* sq_inplace_repeat; */ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static PyMemberDef BaseException_members[] = { | static PyMemberDef BaseException_members[] = { | ||||||
|     {"message", T_OBJECT, offsetof(PyBaseExceptionObject, message), 0, |     {"message", T_OBJECT, offsetof(PyBaseExceptionObject, message), 0, | ||||||
|         PyDoc_STR("exception message")}, |         PyDoc_STR("exception message")}, | ||||||
|  | @ -283,7 +256,7 @@ static PyTypeObject _PyExc_BaseException = { | ||||||
|     0,                          /* tp_compare; */ |     0,                          /* tp_compare; */ | ||||||
|     (reprfunc)BaseException_repr, /*tp_repr*/ |     (reprfunc)BaseException_repr, /*tp_repr*/ | ||||||
|     0,                          /*tp_as_number*/ |     0,                          /*tp_as_number*/ | ||||||
|     &BaseException_as_sequence, /*tp_as_sequence*/ |     0,                          /*tp_as_sequence*/ | ||||||
|     0,                          /*tp_as_mapping*/ |     0,                          /*tp_as_mapping*/ | ||||||
|     0,                          /*tp_hash */ |     0,                          /*tp_hash */ | ||||||
|     0,                          /*tp_call*/ |     0,                          /*tp_call*/ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Brett Cannon
						Brett Cannon