[Python-checkins] r53510 - in python/branches/release25-maint: Lib/test/test_array.py Lib/test/test_deque.py Lib/test/test_itertools.py Lib/test/test_random.py Misc/NEWS Modules/_randommodule.c Modules/arraymodule.c Modules/collectionsmodule.c Modules/itertoolsmodule.c
georg.brandl
python-checkins at python.org
Sun Jan 21 11:28:59 CET 2007
Author: georg.brandl
Date: Sun Jan 21 11:28:56 2007
New Revision: 53510
Modified:
python/branches/release25-maint/Lib/test/test_array.py
python/branches/release25-maint/Lib/test/test_deque.py
python/branches/release25-maint/Lib/test/test_itertools.py
python/branches/release25-maint/Lib/test/test_random.py
python/branches/release25-maint/Misc/NEWS
python/branches/release25-maint/Modules/_randommodule.c
python/branches/release25-maint/Modules/arraymodule.c
python/branches/release25-maint/Modules/collectionsmodule.c
python/branches/release25-maint/Modules/itertoolsmodule.c
Log:
Bug #1486663: don't reject keyword arguments for subclasses of builtin
types.
(backport from rev. 53509)
Modified: python/branches/release25-maint/Lib/test/test_array.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_array.py (original)
+++ python/branches/release25-maint/Lib/test/test_array.py Sun Jan 21 11:28:56 2007
@@ -12,6 +12,10 @@
class ArraySubclass(array.array):
pass
+class ArraySubclassWithKwargs(array.array):
+ def __init__(self, typecode, newarg=None):
+ array.array.__init__(typecode)
+
tests = [] # list to accumulate all tests
typecodes = "cubBhHiIlLfd"
@@ -683,6 +687,9 @@
b = array.array('B', range(64))
self.assertEqual(rc, sys.getrefcount(10))
+ def test_subclass_with_kwargs(self):
+ # SF bug #1486663 -- this used to erroneously raise a TypeError
+ ArraySubclassWithKwargs('b', newarg=1)
class StringTest(BaseTest):
Modified: python/branches/release25-maint/Lib/test/test_deque.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_deque.py (original)
+++ python/branches/release25-maint/Lib/test/test_deque.py Sun Jan 21 11:28:56 2007
@@ -486,6 +486,16 @@
d1 == d2 # not clear if this is supposed to be True or False,
# but it used to give a SystemError
+
+class SubclassWithKwargs(deque):
+ def __init__(self, newarg=1):
+ deque.__init__(self)
+
+class TestSubclassWithKwargs(unittest.TestCase):
+ def test_subclass_with_kwargs(self):
+ # SF bug #1486663 -- this used to erroneously raise a TypeError
+ SubclassWithKwargs(newarg=1)
+
#==============================================================================
libreftest = """
@@ -599,6 +609,7 @@
TestBasic,
TestVariousIteratorArgs,
TestSubclass,
+ TestSubclassWithKwargs,
)
test_support.run_unittest(*test_classes)
Modified: python/branches/release25-maint/Lib/test/test_itertools.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_itertools.py (original)
+++ python/branches/release25-maint/Lib/test/test_itertools.py Sun Jan 21 11:28:56 2007
@@ -740,6 +740,21 @@
self.assertRaises(AssertionError, list, cycle(gen1()))
self.assertEqual(hist, [0,1])
+class SubclassWithKwargsTest(unittest.TestCase):
+ def test_keywords_in_subclass(self):
+ # count is not subclassable...
+ for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
+ starmap, islice, takewhile, dropwhile, cycle):
+ class Subclass(cls):
+ def __init__(self, newarg=None, *args):
+ cls.__init__(self, *args)
+ try:
+ Subclass(newarg=1)
+ except TypeError, err:
+ # we expect type errors because of wrong argument count
+ self.failIf("does not take keyword arguments" in err.args[0])
+
+
libreftest = """ Doctest for examples in the library reference: libitertools.tex
@@ -934,7 +949,8 @@
def test_main(verbose=None):
test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
- RegressionTests, LengthTransparency)
+ RegressionTests, LengthTransparency,
+ SubclassWithKwargsTest)
test_support.run_unittest(*test_classes)
# verify reference counting
Modified: python/branches/release25-maint/Lib/test/test_random.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_random.py (original)
+++ python/branches/release25-maint/Lib/test/test_random.py Sun Jan 21 11:28:56 2007
@@ -516,6 +516,14 @@
# tests validity but not completeness of the __all__ list
self.failUnless(set(random.__all__) <= set(dir(random)))
+ def test_random_subclass_with_kwargs(self):
+ # SF bug #1486663 -- this used to erroneously raise a TypeError
+ class Subclass(random.Random):
+ def __init__(self, newarg=None):
+ random.Random.__init__(self)
+ Subclass(newarg=1)
+
+
def test_main(verbose=None):
testclasses = [WichmannHill_TestBasicOps,
MersenneTwister_TestBasicOps,
Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS (original)
+++ python/branches/release25-maint/Misc/NEWS Sun Jan 21 11:28:56 2007
@@ -91,6 +91,9 @@
Extension Modules
-----------------
+- Bug #1486663: don't reject keyword arguments for subclasses of builtin
+ types.
+
- The version number of the ctypes package was changed to "1.0.2".
- Patch #1544279: Improve thread-safety of the socket module by moving
Modified: python/branches/release25-maint/Modules/_randommodule.c
==============================================================================
--- python/branches/release25-maint/Modules/_randommodule.c (original)
+++ python/branches/release25-maint/Modules/_randommodule.c Sun Jan 21 11:28:56 2007
@@ -481,7 +481,7 @@
RandomObject *self;
PyObject *tmp;
- if (!_PyArg_NoKeywords("Random()", kwds))
+ if (type == &Random_Type && !_PyArg_NoKeywords("Random()", kwds))
return NULL;
self = (RandomObject *)type->tp_alloc(type, 0);
Modified: python/branches/release25-maint/Modules/arraymodule.c
==============================================================================
--- python/branches/release25-maint/Modules/arraymodule.c (original)
+++ python/branches/release25-maint/Modules/arraymodule.c Sun Jan 21 11:28:56 2007
@@ -1797,7 +1797,7 @@
PyObject *initial = NULL, *it = NULL;
struct arraydescr *descr;
- if (!_PyArg_NoKeywords("array.array()", kwds))
+ if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
return NULL;
if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
Modified: python/branches/release25-maint/Modules/collectionsmodule.c
==============================================================================
--- python/branches/release25-maint/Modules/collectionsmodule.c (original)
+++ python/branches/release25-maint/Modules/collectionsmodule.c Sun Jan 21 11:28:56 2007
@@ -95,7 +95,7 @@
dequeobject *deque;
block *b;
- if (!_PyArg_NoKeywords("deque()", kwds))
+ if (type == &deque_type && !_PyArg_NoKeywords("deque()", kwds))
return NULL;
/* create dequeobject structure */
Modified: python/branches/release25-maint/Modules/itertoolsmodule.c
==============================================================================
--- python/branches/release25-maint/Modules/itertoolsmodule.c (original)
+++ python/branches/release25-maint/Modules/itertoolsmodule.c Sun Jan 21 11:28:56 2007
@@ -681,7 +681,7 @@
PyObject *saved;
cycleobject *lz;
- if (!_PyArg_NoKeywords("cycle()", kwds))
+ if (type == &cycle_type && !_PyArg_NoKeywords("cycle()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "cycle", 1, 1, &iterable))
@@ -831,7 +831,7 @@
PyObject *it;
dropwhileobject *lz;
- if (!_PyArg_NoKeywords("dropwhile()", kwds))
+ if (type == &dropwhile_type && !_PyArg_NoKeywords("dropwhile()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "dropwhile", 2, 2, &func, &seq))
@@ -975,7 +975,7 @@
PyObject *it;
takewhileobject *lz;
- if (!_PyArg_NoKeywords("takewhile()", kwds))
+ if (type == &takewhile_type && !_PyArg_NoKeywords("takewhile()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "takewhile", 2, 2, &func, &seq))
@@ -1120,7 +1120,7 @@
Py_ssize_t numargs;
isliceobject *lz;
- if (!_PyArg_NoKeywords("islice()", kwds))
+ if (type == &islice_type && !_PyArg_NoKeywords("islice()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "islice", 2, 4, &seq, &a1, &a2, &a3))
@@ -1311,7 +1311,7 @@
PyObject *it;
starmapobject *lz;
- if (!_PyArg_NoKeywords("starmap()", kwds))
+ if (type == &starmap_type && !_PyArg_NoKeywords("starmap()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "starmap", 2, 2, &func, &seq))
@@ -1443,7 +1443,7 @@
imapobject *lz;
Py_ssize_t numargs, i;
- if (!_PyArg_NoKeywords("imap()", kwds))
+ if (type == &imap_type && !_PyArg_NoKeywords("imap()", kwds))
return NULL;
numargs = PyTuple_Size(args);
@@ -1625,7 +1625,7 @@
Py_ssize_t i;
PyObject *ittuple;
- if (!_PyArg_NoKeywords("chain()", kwds))
+ if (type == &chain_type && !_PyArg_NoKeywords("chain()", kwds))
return NULL;
/* obtain iterators */
@@ -1768,7 +1768,7 @@
PyObject *it;
ifilterobject *lz;
- if (!_PyArg_NoKeywords("ifilter()", kwds))
+ if (type == &ifilter_type && !_PyArg_NoKeywords("ifilter()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "ifilter", 2, 2, &func, &seq))
@@ -1912,7 +1912,8 @@
PyObject *it;
ifilterfalseobject *lz;
- if (!_PyArg_NoKeywords("ifilterfalse()", kwds))
+ if (type == &ifilterfalse_type &&
+ !_PyArg_NoKeywords("ifilterfalse()", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "ifilterfalse", 2, 2, &func, &seq))
@@ -2054,7 +2055,7 @@
countobject *lz;
Py_ssize_t cnt = 0;
- if (!_PyArg_NoKeywords("count()", kwds))
+ if (type == &count_type && !_PyArg_NoKeywords("count()", kwds))
return NULL;
if (!PyArg_ParseTuple(args, "|n:count", &cnt))
@@ -2153,7 +2154,7 @@
PyObject *result;
Py_ssize_t tuplesize = PySequence_Length(args);
- if (!_PyArg_NoKeywords("izip()", kwds))
+ if (type == &izip_type && !_PyArg_NoKeywords("izip()", kwds))
return NULL;
/* args must be a tuple */
@@ -2336,7 +2337,7 @@
PyObject *element;
Py_ssize_t cnt = -1;
- if (!_PyArg_NoKeywords("repeat()", kwds))
+ if (type == &repeat_type && !_PyArg_NoKeywords("repeat()", kwds))
return NULL;
if (!PyArg_ParseTuple(args, "O|n:repeat", &element, &cnt))
More information about the Python-checkins
mailing list