[Python-Dev] Why is the return value of __contains__ coerced to boolean, but that of __lt__ and the like is not?

Ben Hoyt benhoyt at gmail.com
Mon Jul 15 02:21:38 CEST 2013


I'm curious why the return value of __contains__ is coerced to True or
False, whereas the return value of "normal" comparison operators like
__lt__ and the like are not. The latter return the value directly without
forcing it to be True or False.

This makes overriding __contains__ significantly less flexible, so I'm
wondering why it's designed or implemented that way. (I believe it's the
cmp_outcome() function in Python/ceval.c that does this:
http://hg.python.org/cpython/file/db9fe49069ed/Python/ceval.c#l4545)

For example, the "peewee" ORM overloads __lt__ and the like so it can map
Python expressions to SQL. But it can't do this with the "in" operator due
to the result of "x in y" always returning True or False in Python. So it
(ab)uses the "<<" operator to do this instead (See the peewee docs at
http://peewee.readthedocs.org/en/latest/peewee/querying.html#column-lookups
).

I'm sure there's a good reason for why "in" is different here, but I can't
see why right now.

-Ben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130715/e1126a2e/attachment.html>


More information about the Python-Dev mailing list