diff options
author | Raymond Hettinger <python@rcn.com> | 2004-04-04 08:51:41 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2004-04-04 08:51:41 (GMT) |
commit | e2eda606a83cbe68846faf44b478053e250fb025 (patch) | |
tree | b9241a4342bc1111b71e173ac0c3c284dc1cda10 | |
parent | d12dfbbcd90286067bc76b53fd48aedd3efbfdd2 (diff) | |
download | cpython-e2eda606a83cbe68846faf44b478053e250fb025.zip cpython-e2eda606a83cbe68846faf44b478053e250fb025.tar.gz cpython-e2eda606a83cbe68846faf44b478053e250fb025.tar.bz2 |
Improve accuracy of sequence and mapping checks.
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/abstract.c | 10 |
2 files changed, 11 insertions, 2 deletions
@@ -202,6 +202,9 @@ Core and builtins Extension modules ----------------- +- operator.isMappingType() and operator.isSequenceType() now give + fewer false positives. + - socket.sslerror is now a subclass of socket.error . Also added socket.error to the socket module's C API. diff --git a/Objects/abstract.c b/Objects/abstract.c index bf60c75..307ef86 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1058,6 +1058,8 @@ PyNumber_Float(PyObject *o) int PySequence_Check(PyObject *s) { + if (PyInstance_Check(s)) + return PyObject_HasAttrString(s, "__getitem__"); return s != NULL && s->ob_type->tp_as_sequence && s->ob_type->tp_as_sequence->sq_item != NULL; } @@ -1600,8 +1602,12 @@ PySequence_Index(PyObject *s, PyObject *o) int PyMapping_Check(PyObject *o) { - return o && o->ob_type->tp_as_mapping && - o->ob_type->tp_as_mapping->mp_subscript; + if (PyInstance_Check(o)) + return PyObject_HasAttrString(o, "__getitem__"); + + return o && o->ob_type->tp_as_mapping && + o->ob_type->tp_as_mapping->mp_subscript && + !PyObject_HasAttrString(o, "__getslice__"); } int |