Index: Lib/test/test_deque.py =================================================================== --- Lib/test/test_deque.py (revision 46052) +++ Lib/test/test_deque.py (working copy) @@ -403,6 +403,14 @@ def __iter__(self): raise TypeError +class DequeWithGoodConstructor(deque): + def __init__(self, iterable, ignore): + deque.__init__(self, iterable) + +class DequeWithBadConstructor(deque): + def __new__(cls, iterable, ignore): + return deque.__new__(cls, iterable) + class TestSubclass(unittest.TestCase): def test_basics(self): @@ -427,6 +435,17 @@ d.clear() self.assertEqual(len(d), 0) + def test_constructor_allowed_args(self): + s1 = DequeWithGoodConstructor([], 'spam') + s2 = DequeWithGoodConstructor(iterable=[], ignore='spam') + self.assertEqual(s1, s2) + + def test_constructor_prohibited_args(self): + self.assertRaises(TypeError, DequeWithBadConstructor, [], 'spam') + self.assertRaises(TypeError, DequeWithBadConstructor, iterable=[], + ignore='spam') + + def test_copy_pickle(self): d = Deque('abc') Index: Lib/test/test_set.py =================================================================== --- Lib/test/test_set.py (revision 46052) +++ Lib/test/test_set.py (working copy) @@ -428,9 +428,27 @@ class SetSubclass(set): pass +class SetWithGoodConstructor(set): + def __init__(self, iterable, ignore): + set.__init__(self, iterable) + +class SetWithBadConstructor(set): + def __new__(cls, iterable, ignore): + return set.__new__(cls, iterable) + class TestSetSubclass(TestSet): thetype = SetSubclass + def test_constructor_allowed_args(self): + s1 = SetWithGoodConstructor([], 'spam') + s2 = SetWithGoodConstructor(iterable=[], ignore='spam') + self.assertEqual(s1, s2) + + def test_constructor_prohibited_args(self): + self.assertRaises(TypeError, SetWithBadConstructor, [], 'spam') + self.assertRaises(TypeError, SetWithBadConstructor, iterable=[], + ignore='spam') + class TestFrozenSet(TestJointOps): thetype = frozenset @@ -496,6 +514,14 @@ class FrozenSetSubclass(frozenset): pass +class FrozenSetWithGoodConstructor(frozenset): + def __new__(cls, iterable, ignore): + return frozenset.__new__(cls, iterable) + +class FrozenSetWithBadConstructor(frozenset): + def __init__(self, iterable, ignore): + frozenset.__init__(self, iterable) + class TestFrozenSetSubclass(TestFrozenSet): thetype = FrozenSetSubclass @@ -504,6 +530,16 @@ t = self.thetype(s) self.assertNotEqual(id(s), id(t)) + def test_constructor_allowed_args(self): + s1 = FrozenSetWithGoodConstructor([], 'spam') + s2 = FrozenSetWithGoodConstructor(iterable=[], ignore='spam') + self.assertEqual(s1, s2) + + def test_constructor_prohibited_args(self): + self.assertRaises(TypeError, FrozenSetWithBadConstructor, [], 'spam') + self.assertRaises(TypeError, FrozenSetWithBadConstructor, iterable=[], + ignore='spam') + def test_copy(self): dup = self.s.copy() self.assertNotEqual(id(self.s), id(dup)) Index: Modules/collectionsmodule.c =================================================================== --- Modules/collectionsmodule.c (revision 46052) +++ Modules/collectionsmodule.c (working copy) @@ -95,9 +95,6 @@ dequeobject *deque; block *b; - if (!_PyArg_NoKeywords("deque()", kwds)) - return NULL; - /* create dequeobject structure */ deque = (dequeobject *)type->tp_alloc(type, 0); if (deque == NULL) @@ -763,6 +760,9 @@ { PyObject *iterable = NULL; + if (!_PyArg_NoKeywords("deque()", kwds)) + return -1; + if (!PyArg_UnpackTuple(args, "deque", 0, 1, &iterable)) return -1; Index: Objects/setobject.c =================================================================== --- Objects/setobject.c (revision 46052) +++ Objects/setobject.c (working copy) @@ -985,9 +985,6 @@ static PyObject * set_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - if (!_PyArg_NoKeywords("set()", kwds)) - return NULL; - return make_new_set(type, NULL); } @@ -1682,6 +1679,8 @@ { PyObject *iterable = NULL; + if (!_PyArg_NoKeywords("set()", kwds)) + return -1; if (!PyAnySet_Check(self)) return -1; if (!PyArg_UnpackTuple(args, self->ob_type->tp_name, 0, 1, &iterable))