From: Guido van Rossum Date: Thu, 13 Aug 1998 16:44:44 +0000 (+0000) Subject: Better error messages when a sequence is indexed with a non-integer. X-Git-Tag: v1.5.2a2~401 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=21308243ca028e06f03336f9d84edbeebcfb1da2;p=python 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 7458b94dfb..123455ae12 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -232,8 +232,11 @@ PyObject_GetItem(o, key) 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 @@ PyObject_SetItem(o, key, value) 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 @@ PyObject_DelItem(o, key) 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;