On Mon, 09 Jun 2014 18:57:28 +0300, Paul Sokolovsky wrote:
> On Mon, 9 Jun 2014 08:34:42 -0700 (PDT) Roy Smith <r...@panix.com> wrote:
>> We noticed recently that:
>> >>> None in 'foo'
>> raises (at least in Python 2.7)
>> TypeError: 'in <string>' requires string as left operand, not NoneType
>> This is surprising. The description of the 'in' operatator is, 'True
>> if an item of s is equal to x, else False '. From that, I would
>> it behaves as if it were written:
>> for item in iterable:
>> if item == x:
>> return True
>> return False
>> why the extra type check for str.__contains__()? That seems very
>> unpythonic. Duck typing, and all that. --
> This is very Pythonic, Python is strictly typed language. There's no way
> None could possibly be "inside" a string,
Then `None in some_string` could immediately return False, instead of
raising an exception.
> so if you're trying to look
> for it there, you're doing something wrong, and told so.
This, I think, is the important factor. `x in somestring` is almost
always an error if x is not a string. If you want to accept None as well:
x is not None and x in somestring
does the job nicely.