why not "'in' in 'in'"?

David LeBlanc whisper at oz.net
Thu Jun 13 22:18:57 EDT 2002


> -----Original Message-----
> From: python-list-admin at python.org
> [mailto:python-list-admin at python.org]On Behalf Of Tim Peters
> Sent: Thursday, June 13, 2002 18:57
> To: python-list at python.org
> Cc: Grant Griffin
> Subject: RE: why not "'in' in 'in'"?
>
>
> [Grant Griffin]
> > One of the things I like about Python is that it works as expected.
> > However, I sometimes accidently expect it to allow one to use "in"
> > to determine if one string is "in" another, e.g.:
> >
> > >>> 'in' in 'in'
> >
> > which yields a traceback:
> >
> >    Traceback (most recent call last):
> >      File "<interactive input>", line 1, in ?
> >    TypeError: 'in <string>' requires character as left operand
> >
> > ...
> >
> > So why is the "in" operator limited to single characters when used as a
> > membership operator?
>
> In The Beginning, "x in y" was implemented as if via:
>
> def like_in(x, y):
>     for element in y:
>         if cmp(x, element) == 0:
>             return 1
>     return 0
>
> That's still close(*) to what it does if the class of y doesn't implement
> the newer-fangled __contains__ method.  Ponder what like_in(x, y)
> does when
> x and y are strings:  it can't possibly return 1 unless x is a 1-character
> string, because each value element takes on is a 1-character string.
> Therefore "str1 in str2" raised an exception when len(str1) != 1, as you
> almost certainly didn't intend to use this as an expensive and obscure way
> to spell 0.  If that's what you really wanted, fine, but then Guido wanted
> to help you achieve that goal by forcing you to use some way even more
> expensive and obscure <wink>.
>
> But that was then.  Python does allow defining __contains__ methods now,
> precisely so that a type can define the meaning of "x in y" in
> whatever way
> makes most sense for type(y).  The meaning of "in" is no longer
> *defined* by
> like_in, and consequently Guido agrees that the string behavior is much
> harder to justify now.
>
> So if somebody wants this change enough to submit a patch (code,
> doc, + test
> suite changes), it's likely to be accepted for 2.3.  As code changes go,
> this one should be particularly easy.  We have an internal bet going as to
> whether this invitation is enough to kill the idea <wink>.
>
> some-parts-of-this-were-actually-true-ly y'rs  - tim
>
>
> (*) The default implementation today uses "x == element" instead
> of cmp, so
> that a type implementing only __eq__ works fine.  Other than that, same
> thing.
>

Hmmm... How about calling it "contains" instead of "in"? "if 'feefifofum'
contains 'fi'" seems nicer then "if 'fi' in 'feefifofum'" maybe?

Of course maybe this makes too much sense for a language where zip has zip
to do with compression and yield nothing to do with threads.

Dave LeBlanc
Seattle, WA USA






More information about the Python-list mailing list