From 21308243ca028e06f03336f9d84edbeebcfb1da2 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 13 Aug 1998 16:44:44 +0000 Subject: [PATCH] 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). --- Objects/abstract.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Objects/abstract.c b/Objects/abstract.c index 7458b94dfb8..123455ae124 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;