]> granicus.if.org Git - python/commitdiff
PyObject_GetItem(), PyObject_SetItem(), PyObject_DelItem(): Fix a few
authorGuido van Rossum <guido@python.org>
Sat, 24 Nov 2001 18:24:47 +0000 (18:24 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 24 Nov 2001 18:24:47 +0000 (18:24 +0000)
confusing error messages.  If a new-style class has no sequence or
mapping behavior, attempting to use the indexing notation with a
non-integer key would complain that the sequence index must be an
integer, rather than complaining that the operation is not supported.

Objects/abstract.c

index 0856f19676c365babca046014541640d3d24eaa6..59314497bd41231f64a8e6e13138b02f6caf1b74 100644 (file)
@@ -103,7 +103,8 @@ PyObject_GetItem(PyObject *o, PyObject *key)
                                return NULL;
                        return PySequence_GetItem(o, key_value);
                }
-               return type_error("sequence index must be integer");
+               else if (o->ob_type->tp_as_sequence->sq_item)
+                       return type_error("sequence index must be integer");
        }
 
        return type_error("unsubscriptable object");
@@ -131,8 +132,10 @@ PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
                                return -1;
                        return PySequence_SetItem(o, key_value, value);
                }
-               type_error("sequence index must be integer");
-               return -1;
+               else if (o->ob_type->tp_as_sequence->sq_ass_item) {
+                       type_error("sequence index must be integer");
+                       return -1;
+               }
        }
 
        type_error("object does not support item assignment");
@@ -161,8 +164,10 @@ PyObject_DelItem(PyObject *o, PyObject *key)
                                return -1;
                        return PySequence_DelItem(o, key_value);
                }
-               type_error("sequence index must be integer");
-               return -1;
+               else if (o->ob_type->tp_as_sequence->sq_ass_item) {
+                       type_error("sequence index must be integer");
+                       return -1;
+               }
        }
 
        type_error("object does not support item deletion");