? 'in' operator and fallback to __getitem__
davea at ieee.org
Mon May 18 23:24:12 CEST 2009
Tim Hoffman wrote:
> Which suggests to me there must be some sort of order of precedence
> between __contains__ and __getitem__
> and 'for' statement must change the order in some manner.
> Thanks for the reply
(Please don't top-post. It makes reading the quoted portions hard,
since they're then out of order. To solve the problem here, I had to
delete the other parts)
"in" is both a keyword and an operator, with entirely different semantics.
As a keyword, it's used inside a for statement, the expression (after
the in) must return an iterable object.
As an operator, it's used inside an arbitrary expression. It is this
case which is described in the docs:
>>>For user-defined classes which define the __contains__()
<datamodel.html#object.__contains__> method, x in y is true if and only
if y.__contains__(x) is true.
>>>For user-defined classes which do not define __contains__()
<datamodel.html#object.__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
<../library/exceptions.html#exceptions.IndexError> exception. (If any
other exception is
>>>raised, it is as if in <#in> raised that exception).
More information about the Python-list