mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
The final tweaks before closing
[ 633152 ] list slice ass ignores subtypes of list Allow arbitrary sequences on the RHS of extended slices.
This commit is contained in:
parent
7bc2e1dad7
commit
a69c030c15
2 changed files with 29 additions and 22 deletions
|
@ -430,6 +430,10 @@ b[slice(2,3)] = ["two", "elements"]
|
||||||
c[2:3:] = ["two", "elements"]
|
c[2:3:] = ["two", "elements"]
|
||||||
vereq(a, b)
|
vereq(a, b)
|
||||||
vereq(a, c)
|
vereq(a, c)
|
||||||
|
a = range(10)
|
||||||
|
a[::2] = tuple(range(5))
|
||||||
|
vereq(a, [0, 1, 1, 3, 2, 5, 3, 7, 4, 9])
|
||||||
|
|
||||||
|
|
||||||
print '6.6 Mappings == Dictionaries'
|
print '6.6 Mappings == Dictionaries'
|
||||||
d = {}
|
d = {}
|
||||||
|
|
|
@ -2238,33 +2238,36 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* assign slice */
|
/* assign slice */
|
||||||
PyObject **garbage, *ins;
|
PyObject **garbage, *ins, *seq;
|
||||||
int cur, i;
|
int cur, i;
|
||||||
|
|
||||||
if (!PyList_Check(value)) {
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"must assign list (not \"%.200s\") to slice",
|
|
||||||
value->ob_type->tp_name);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyList_GET_SIZE(value) != slicelength) {
|
|
||||||
PyErr_Format(PyExc_ValueError,
|
|
||||||
"attempt to assign list of size %d to extended slice of size %d",
|
|
||||||
PyList_Size(value), slicelength);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!slicelength)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* protect against a[::-1] = a */
|
/* protect against a[::-1] = a */
|
||||||
if (self == (PyListObject*)value) {
|
if (self == (PyListObject*)value) {
|
||||||
value = list_slice((PyListObject*)value, 0,
|
seq = list_slice((PyListObject*)value, 0,
|
||||||
PyList_GET_SIZE(value));
|
PyList_GET_SIZE(value));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Py_INCREF(value);
|
char msg[256];
|
||||||
|
PyOS_snprintf(msg, sizeof(msg),
|
||||||
|
"must assign sequence (not \"%.200s\") to extended slice",
|
||||||
|
value->ob_type->tp_name);
|
||||||
|
seq = PySequence_Fast(value, msg);
|
||||||
|
if (!seq)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
|
||||||
|
PyErr_Format(PyExc_ValueError,
|
||||||
|
"attempt to assign sequence of size %d to extended slice of size %d",
|
||||||
|
PySequence_Fast_GET_SIZE(seq),
|
||||||
|
slicelength);
|
||||||
|
Py_DECREF(seq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!slicelength) {
|
||||||
|
Py_DECREF(seq);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
garbage = (PyObject**)
|
garbage = (PyObject**)
|
||||||
|
@ -2274,7 +2277,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
|
||||||
cur += step, i++) {
|
cur += step, i++) {
|
||||||
garbage[i] = PyList_GET_ITEM(self, cur);
|
garbage[i] = PyList_GET_ITEM(self, cur);
|
||||||
|
|
||||||
ins = PyList_GET_ITEM(value, i);
|
ins = PySequence_Fast_GET_ITEM(seq, i);
|
||||||
Py_INCREF(ins);
|
Py_INCREF(ins);
|
||||||
PyList_SET_ITEM(self, cur, ins);
|
PyList_SET_ITEM(self, cur, ins);
|
||||||
}
|
}
|
||||||
|
@ -2284,7 +2287,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
|
||||||
}
|
}
|
||||||
|
|
||||||
PyMem_FREE(garbage);
|
PyMem_FREE(garbage);
|
||||||
Py_DECREF(value);
|
Py_DECREF(seq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue