[Python-Dev] Re: Sets: elt in dict, lst.include
Ka-Ping Yee
ping@lfw.org
Wed, 31 Jan 2001 09:14:15 -0800 (PST)
On Wed, 31 Jan 2001, Skip Montanaro wrote:
> Ping> x is sequence-like if it provides __getitem__() but not keys()
>
> So why does this barf?
>
> >>> [].__getitem__
I was describing how to tell if instances are sequence-like. Before
we get to make that judgement, first we have to look at the C method
table. So:
x is sequence-like if it has tp_as_sequence;
all instances have tp_as_sequence;
an instance is sequence-like if it has __getitem__() but not keys()
x is mapping-like if it has tp_as_mapping;
all instances have tp_as_mapping;
an instance is mapping-like if it has both __getitem__() and keys()
The "in" operator is implemented this way.
x customizes "in" if it has sq_contains;
all instances have sq_contains;
an instance customizes "in" if it has __contains__()
If sq_contains is missing, or if an instance has no __contains__ method,
we supply the default behaviour by comparing the operand to each member
of x in turn. This default behaviour is implemented twice: once in
PyObject_Contains, and once in instance_contains.
So i proposed this same structure for sq_iter and __iter__.
x customizes "for ... in x" if it has sq_iter;
all instances have sq_iter;
an instance customizes "in" if it has __iter__()
If sq_iter is missing, or if an instance has no __iter__ method,
we supply the default behaviour by calling PyObject_GetItem on x
and incrementing the index until IndexError.
-- ?!ng
"The only `intuitive' interface is the nipple. After that, it's all learned."
-- Bruce Ediger, on user interfaces