summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-04-04 08:51:41 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-04-04 08:51:41 (GMT)
commite2eda606a83cbe68846faf44b478053e250fb025 (patch)
treeb9241a4342bc1111b71e173ac0c3c284dc1cda10
parentd12dfbbcd90286067bc76b53fd48aedd3efbfdd2 (diff)
downloadcpython-e2eda606a83cbe68846faf44b478053e250fb025.zip
cpython-e2eda606a83cbe68846faf44b478053e250fb025.tar.gz
cpython-e2eda606a83cbe68846faf44b478053e250fb025.tar.bz2
Improve accuracy of sequence and mapping checks.
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/abstract.c10
2 files changed, 11 insertions, 2 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index b1f2043..c51b74b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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