summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanyam Khurana <8039608+CuriousLearner@users.noreply.github.com>2019-02-19 13:23:48 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2019-02-19 13:23:48 (GMT)
commit5105483acb3aca318304bed056dcfd7e188fe4b5 (patch)
treed0597928b1f356700d4b0d841a49e1827b07a915
parentf522a57ec77921ee2e60bd4ccda3c8daa5a43e95 (diff)
downloadcpython-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.py20
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst3
-rw-r--r--Objects/typeobject.c9
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) {