On Sun, Feb 23, 2020 at 10:17:03PM -0000, Alex Hall wrote:
> Steven D'Aprano wrote:

> > Conceptually, we should be able to reason that every object that 
> > supports indexing should be iterable, without adding a special case 
> > exception "...except for str".
> 
> Strings already have an exception in this area. Usually `x in y` means 
> `any(x == elem for elem in y)`.

I don't think that there is anything specific to the `in` operator that 
demands that it is implemented that way. It is certainly a reasonable 
default implementation (I think Ruby offers it as method on a base 
class) but the `in` operator conceptually provides a containment test 
which might be far more general than the above:

- number in interval
- location in region
- subset in set
- subtree in tree
- offence in criminal_record
- monster in room

just off the top of my head.

In the case of strings, if the argument is a length-1 string, then your 
implementation works. If it isn't, a generalisation of it works: rather 
than iterate over substrings of length 1, iterate over substrings of 
the same length as the argument.

So conceptually we have the string `in` operator being equivalent to:

    any(arg == sub for sub in thestring)

except that iteration is not necessarily in length-1 chunks.

(Note that for efficiency reasons, string containment testing may not 
actually be implemented in that way.)


> Another somewhat related example: we usually accept that basically 
> every object can be treated as a boolean, even more so of it has a 
> `__len__`. But numpy and pandas break this 'rule' by raising an 
> exception if you try to treat an array as a boolean

Yes, they do, and I think they are wrong to have done so. But they had 
their reasons, and its hard to know whether any other alternative would 
have been better.


-- 
Steven
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/S6437OXHM26WFCLQVUEWA47A34GSG3G6/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to