diff options
author | Sanyam Khurana <8039608+CuriousLearner@users.noreply.github.com> | 2019-02-19 13:23:48 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2019-02-19 13:23:48 (GMT) |
commit | 5105483acb3aca318304bed056dcfd7e188fe4b5 (patch) | |
tree | d0597928b1f356700d4b0d841a49e1827b07a915 | |
parent | f522a57ec77921ee2e60bd4ccda3c8daa5a43e95 (diff) | |
download | cpython-5105483acb3aca318304bed056dcfd7e188fe4b5.zip cpython-5105483acb3aca318304bed056dcfd7e188fe4b5.tar.gz cpython-5105483acb3aca318304bed056dcfd7e188fe4b5.tar.bz2 |
bpo-31506: Clarify error messages for object.__new__ and object.__init__ (GH-11641)
`object.__new__` and `object.__init__` do take one argument each,
they just don't take extra user supplied arguments.
Patch by Sanyam Khurana.
-rw-r--r-- | Lib/test/test_class.py | 20 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst | 3 | ||||
-rw-r--r-- | Objects/typeobject.c | 9 |
3 files changed, 22 insertions, 10 deletions
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 998452a..456f1be 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -618,19 +618,21 @@ class ClassTests(unittest.TestCase): class C: pass + error_msg = r'C.__init__\(\) takes exactly one argument \(the instance to initialize\)' + with self.assertRaisesRegex(TypeError, r'C\(\) takes no arguments'): C(42) with self.assertRaisesRegex(TypeError, r'C\(\) takes no arguments'): C.__new__(C, 42) - with self.assertRaisesRegex(TypeError, r'C\(\).__init__\(\) takes no arguments'): + with self.assertRaisesRegex(TypeError, error_msg): C().__init__(42) with self.assertRaisesRegex(TypeError, r'C\(\) takes no arguments'): object.__new__(C, 42) - with self.assertRaisesRegex(TypeError, r'C\(\).__init__\(\) takes no arguments'): + with self.assertRaisesRegex(TypeError, error_msg): object.__init__(C(), 42) # Class with both `__init__` & `__new__` method overridden @@ -640,13 +642,15 @@ class ClassTests(unittest.TestCase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - with self.assertRaisesRegex(TypeError, r'object.__new__\(\) takes no argument'): + error_msg = r'object.__new__\(\) takes exactly one argument \(the type to instantiate\)' + + with self.assertRaisesRegex(TypeError, error_msg): D(42) - with self.assertRaisesRegex(TypeError, r'object.__new__\(\) takes no argument'): + with self.assertRaisesRegex(TypeError, error_msg): D.__new__(D, 42) - with self.assertRaisesRegex(TypeError, r'object.__new__\(\) takes no argument'): + with self.assertRaisesRegex(TypeError, error_msg): object.__new__(D, 42) # Class that only overrides __init__ @@ -654,10 +658,12 @@ class ClassTests(unittest.TestCase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - with self.assertRaisesRegex(TypeError, r'object.__init__\(\) takes no argument'): + error_msg = r'object.__init__\(\) takes exactly one argument \(the instance to initialize\)' + + with self.assertRaisesRegex(TypeError, error_msg): E().__init__(42) - with self.assertRaisesRegex(TypeError, r'object.__init__\(\) takes no argument'): + with self.assertRaisesRegex(TypeError, error_msg): object.__init__(E(), 42) if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst b/Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst new file mode 100644 index 0000000..9ebcab7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst @@ -0,0 +1,3 @@ +Clarify the errors reported when ``object.__new__`` and ``object.__init__`` +receive more than one argument. +Contributed by Sanyam Khurana. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ace45ba..e6cf4fb 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3681,11 +3681,13 @@ object_init(PyObject *self, PyObject *args, PyObject *kwds) PyTypeObject *type = Py_TYPE(self); if (excess_args(args, kwds)) { if (type->tp_init != object_init) { - PyErr_SetString(PyExc_TypeError, "object.__init__() takes no arguments"); + PyErr_SetString(PyExc_TypeError, + "object.__init__() takes exactly one argument (the instance to initialize)"); return -1; } if (type->tp_new == object_new) { - PyErr_Format(PyExc_TypeError, "%.200s().__init__() takes no arguments", + PyErr_Format(PyExc_TypeError, + "%.200s.__init__() takes exactly one argument (the instance to initialize)", type->tp_name); return -1; } @@ -3698,7 +3700,8 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { if (excess_args(args, kwds)) { if (type->tp_new != object_new) { - PyErr_SetString(PyExc_TypeError, "object.__new__() takes no arguments"); + PyErr_SetString(PyExc_TypeError, + "object.__new__() takes exactly one argument (the type to instantiate)"); return NULL; } if (type->tp_init == object_init) { |