Guido van Rossum  committed 9031aab

PySequence_Check(), PyMapping_Check(): only return true if the
corresponding "getitem" operation (sq_item or mp_subscript) is
implemented. I realize that "sequence-ness" and "mapping-ness" are
poorly defined (and the tests may still be wrong for user-defined
instances, which always have both slots filled), but I believe that a
sequence that doesn't support its getitem operation should not be
considered a sequence. All other operations are optional though.

For example, the ZODB BTree tests crashed because PySequence_Check()
returned true for a dictionary! (In 2.2, the dictionary type has a
tp_as_sequence pointer, but the only field filled is sq_contains, so
you can write "if key in dict".) With this fix, all standalone ZODB
tests succeed.

  • Participants
  • Parent commits 32cfce4
  • Branches legacy-trunk

Comments (0)

Files changed (1)

File Objects/abstract.c

 PySequence_Check(PyObject *s)
-	return s != NULL && s->ob_type->tp_as_sequence;
+	return s != NULL && s->ob_type->tp_as_sequence &&
+		s->ob_type->tp_as_sequence->sq_item != NULL;
 PyMapping_Check(PyObject *o)
-	return o && o->ob_type->tp_as_mapping;
+	return o && o->ob_type->tp_as_mapping &&
+		o->ob_type->tp_as_mapping->mp_subscript;