]> granicus.if.org Git - python/commitdiff
make extra arguments to object.__init__/__new__ to errors in most cases (finishes...
authorBenjamin Peterson <benjamin@python.org>
Sat, 17 Mar 2012 05:05:44 +0000 (00:05 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sat, 17 Mar 2012 05:05:44 +0000 (00:05 -0500)
Lib/test/test_descr.py
Misc/NEWS
Objects/typeobject.c

index bf82a889e1c8a2d81c9e9ed2401406823e0fddf2..5759effca719bd35ed6790f24dabe1f8c3288321 100644 (file)
@@ -4502,6 +4502,26 @@ order (MRO) for bases """
         for o in gc.get_objects():
             self.assertIsNot(type(o), X)
 
+    def test_object_new_and_init_with_parameters(self):
+        # See issue #1683368
+        class OverrideNeither:
+            pass
+        self.assertRaises(TypeError, OverrideNeither, 1)
+        self.assertRaises(TypeError, OverrideNeither, kw=1)
+        class OverrideNew:
+            def __new__(cls, foo, kw=0, *args, **kwds):
+                return object.__new__(cls, *args, **kwds)
+        class OverrideInit:
+            def __init__(self, foo, kw=0, *args, **kwargs):
+                return object.__init__(self, *args, **kwargs)
+        class OverrideBoth(OverrideNew, OverrideInit):
+            pass
+        for case in OverrideNew, OverrideInit, OverrideBoth:
+            case(1)
+            case(1, kw=2)
+            self.assertRaises(TypeError, case, 1, 2, 3)
+            self.assertRaises(TypeError, case, 1, 2, foo=3)
+
 
 class DictProxyTests(unittest.TestCase):
     def setUp(self):
index 5672fc31d161a1a6d5acd2764740baf259df367a..095bfc8a157be76bb40c2309b45eefc91941046b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.3.0 Alpha 2?
 Core and Builtins
 -----------------
 
+- Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
+  are passed arguments and their complementary method is not overridden.
+
 - Give the ast.AST class a __dict__.
 
 - Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
index b427040fbc35e76dd19e14a9be38d3fe6e161b46..5fbd7cb8d31ea3b047bd01676f3a1f6cc6d0829f 100644 (file)
@@ -2905,22 +2905,11 @@ static int
 object_init(PyObject *self, PyObject *args, PyObject *kwds)
 {
     int err = 0;
-    if (excess_args(args, kwds)) {
-        PyTypeObject *type = Py_TYPE(self);
-        if (type->tp_init != object_init &&
-            type->tp_new != object_new)
-        {
-            err = PyErr_WarnEx(PyExc_DeprecationWarning,
-                       "object.__init__() takes no parameters",
-                       1);
-        }
-        else if (type->tp_init != object_init ||
-                 type->tp_new == object_new)
-        {
-            PyErr_SetString(PyExc_TypeError,
-                "object.__init__() takes no parameters");
-            err = -1;
-        }
+    PyTypeObject *type = Py_TYPE(self);
+    if (excess_args(args, kwds) &&
+        (type->tp_new == object_new || type->tp_init != object_init)) {
+        PyErr_SetString(PyExc_TypeError, "object.__init__() takes no parameters");
+        err = -1;
     }
     return err;
 }
@@ -2928,26 +2917,12 @@ object_init(PyObject *self, PyObject *args, PyObject *kwds)
 static PyObject *
 object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-    int err = 0;
-    if (excess_args(args, kwds)) {
-        if (type->tp_new != object_new &&
-            type->tp_init != object_init)
-        {
-            err = PyErr_WarnEx(PyExc_DeprecationWarning,
-                       "object.__new__() takes no parameters",
-                       1);
-        }
-        else if (type->tp_new != object_new ||
-                 type->tp_init == object_init)
-        {
-            PyErr_SetString(PyExc_TypeError,
-                "object.__new__() takes no parameters");
-            err = -1;
-        }
-    }
-    if (err < 0)
+    if (excess_args(args, kwds) &&
+        (type->tp_init == object_init || type->tp_new != object_new)) {
+        PyErr_SetString(PyExc_TypeError, "object.__new__() takes no parameters");
         return NULL;
-
+    }
     if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) {
         PyObject *abstract_methods = NULL;
         PyObject *builtins;