Better error messages when a sequence is indexed with a non-integer.
Previously, this said "unsubscriptable object"; in 1.5.1, the reverse
problem existed, where None[''] would complain about a non-integer
index. This fix does the right thing in all cases (for get, set and
del item).
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 7458b94..123455a 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -232,8 +232,11 @@
if (m && m->mp_subscript)
return m->mp_subscript(o, key);
- if (PyInt_Check(key))
- return PySequence_GetItem(o, PyInt_AsLong(key));
+ if (o->ob_type->tp_as_sequence) {
+ if (PyInt_Check(key))
+ return PySequence_GetItem(o, PyInt_AsLong(key));
+ return type_error("sequence index must be integer");
+ }
return type_error("unsubscriptable object");
}
@@ -254,8 +257,12 @@
if (m && m->mp_ass_subscript)
return m->mp_ass_subscript(o, key, value);
- if (PyInt_Check(key))
- return PySequence_SetItem(o, PyInt_AsLong(key), value);
+ if (o->ob_type->tp_as_sequence) {
+ if (PyInt_Check(key))
+ return PySequence_SetItem(o, PyInt_AsLong(key), value);
+ type_error("sequence index must be integer");
+ return -1;
+ }
type_error("object does not support item assignment");
return -1;
@@ -276,8 +283,12 @@
if (m && m->mp_ass_subscript)
return m->mp_ass_subscript(o, key, (PyObject*)NULL);
- if (PyInt_Check(key))
- return PySequence_DelItem(o, PyInt_AsLong(key));
+ if (o->ob_type->tp_as_sequence) {
+ if (PyInt_Check(key))
+ return PySequence_DelItem(o, PyInt_AsLong(key));
+ type_error("sequence index must be integer");
+ return -1;
+ }
type_error("object does not support item deletion");
return -1;