Christopher Spears wrote: > I understand that you can use __getitem__ as a hook to > modify indexing behavoir in a class. That's why > __getitem__ not only affects [] but also for loops, > map calls, list comprehension, etc. For loops, etc. > work by indexing a sequences from zero to a higher > index until out-of-bounds is reached. But why does > this work? > > >>>>class stepper: > > ... def __getitem__(self, i): > ... return self.data[i] > ... > >>>>'p' in X > > True > > What does 'in' have to do with indexing?
How do you suppose 'in' works? To see if something is in a list, for example, you have to iterate over each element of the list and check if it is the item you expect. Under the hood, Python will use the __contains__() or __getitem__() special method of a class to evaluate 'x in y'. Loosely speaking, if y is an instance of a class that implements __getitem__() but not __contains__(), 'x in y' is more or less the same as this: def in(x, y): for i in y: if i == x: return True return False From the language reference: "For user-defined classes which do not define __contains__() and do define __getitem__(), x in y is true if and only if there is a non-negative integer index i such that x == y[i], and all lower integer indices do not raise IndexError exception. (If any other exception is raised, it is as if in raised that exception)." http://docs.python.org/ref/comparisons.html#l2h-432 Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor