[Python-Dev] RE: PySequence_Contains

Tim Peters tim.one@home.com
Sat, 5 May 2001 16:40:11 -0400


[Guido]
> This kind of thing happens everywhere -- instances always define all
> slots but using the slots sometimes fails when the corresponding
> __foo__ doesn't exist.  Decisions based on the presence or absence of
> a slot are therefore in general not reliable; the only exception is
> the decision to *call* the slot or not.  The correct solution is not
> to catch AttributeError and pretend that the slot didn't exist (which
> would mask an AttributeError occurring inside the __contains__ method
> if there was one),

Ya, it sucks.  I was inspired by that instance_contains() itself makes
dubious assumptions about what an AttributeError means when the functions
*it* calls raise it <wink>.

> but to reimplement the default behavior in the instance slot
> implementation.

The "backward compatibility" comment in instance_contains() was scary:
compatibility with *what*?  instance_contains() is pretty darn new.  I
assumed it meant there was *some* good (but unidentified) reason we had to
use PyObject_Cmp() instead of PyObject_RichCompareBool(..., Py_EQ) if
instance_item() "worked".  But I haven't thought of one, except to ensure
that

    some_complex  in  some_instance_with___getitem__

continues to blow up -- but that's not a good reason.  So:

> In this case, that means that PySequence_Contains() can be simplified
> (no need to test for AttributeError), and instance_contains() should
> fall back to a loop over iter(self) rather than trying to use
> instance_item().

Will do!