]> granicus.if.org Git - python/commitdiff
This is Alex Martelli's patch
authorMichael W. Hudson <mwh@python.net>
Tue, 5 Nov 2002 17:38:05 +0000 (17:38 +0000)
committerMichael W. Hudson <mwh@python.net>
Tue, 5 Nov 2002 17:38:05 +0000 (17:38 +0000)
[ 633870 ] allow any seq assignment to a list slice

plus a very silly little test case of my own.

Lib/test/test_types.py
Objects/listobject.c

index a38eb7f7d4dd18e05a3f215468c8d6d93cd6271e..9777e838f66f8cd7f11b2cbf2ca32d5dead34b70 100644 (file)
@@ -297,6 +297,10 @@ a *= 0
 if a != []:
     raise TestFailed, "list inplace repeat"
 
+a = []
+a[:] = tuple(range(10))
+if a != range(10):
+    raise TestFailed, "assigning tuple to slice"
 
 print '6.5.3a Additional list operations'
 a = [0,1,2,3,4]
index 45b0951da3ebadc2e38bd95a92dd51749831ef34..c28bfb485a7a7e40f20b92a614df2af552e69ddb 100644 (file)
@@ -448,14 +448,22 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
           list. :-( */
        PyObject **recycle, **p;
        PyObject **item;
+       PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
        int n; /* Size of replacement list */
        int d; /* Change in size */
        int k; /* Loop index */
 #define b ((PyListObject *)v)
        if (v == NULL)
                n = 0;
-       else if (PyList_Check(v)) {
-               n = b->ob_size;
+       else {
+               char msg[256];
+               sprintf(msg, "must assign sequence (not \"%.200s\") to slice",
+                            v->ob_type->tp_name);
+               v_as_SF = PySequence_Fast(v, msg);
+               if(v_as_SF == NULL)
+                       return -1;
+               n = PySequence_Fast_GET_SIZE(v_as_SF);
+
                if (a == b) {
                        /* Special case "a[i:j] = a" -- copy b first */
                        int ret;
@@ -465,12 +473,6 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
                        return ret;
                }
        }
-       else {
-               PyErr_Format(PyExc_TypeError,
-                            "must assign list (not \"%.200s\") to slice",
-                            v->ob_type->tp_name);
-               return -1;
-       }
        if (ilow < 0)
                ilow = 0;
        else if (ilow > a->ob_size)
@@ -512,7 +514,7 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
                a->ob_size += d;
        }
        for (k = 0; k < n; k++, ilow++) {
-               PyObject *w = b->ob_item[k];
+               PyObject *w = PySequence_Fast_GET_ITEM(v_as_SF, k);
                Py_XINCREF(w);
                item[ilow] = w;
        }
@@ -525,6 +527,7 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
                PyMem_FREE(a->ob_item);
                a->ob_item = NULL;
        }
+       Py_XDECREF(v_as_SF);
        return 0;
 #undef b
 }