There's also bisect_left and bisect_right which each do different things. The bisect_left function puts the needle on the right while the bisect_right function puts the needle on the left.
I've thought a bit about these scenarios as the author of Sorted Containers but no user has ever raised an issue about it. Personally, I think the needle should go on the left as it offers the caller greater opportunity to control and customize the __eq__ method that is used. But personal preferences aside, I think the "ship has sailed" and the differences are not worth fixing. I agree with Guido that developers should fix __eq__ to use NotImplemented as it was intended. Grant On Sat, Jul 20, 2019 at 8:33 AM Guido van Rossum <gu...@python.org> wrote: > In an ideal world, needle is on the right. Let's replace needle with a > constant: which of the following looks more natural? > > for x in sequence: > if x == 5: return True > > or > > for x in sequence: > if 5 == x: return True > > For me, 'x == 5' wins with a huge margin. (There is a subculture of C > coders who have trained themselves to write '5 == x' because they're afraid > of accidentally typing 'x = 5', but that doesn't apply to Python.) > > Should we unify the stdlib? I'm not sure -- it feels like a sufficiently > obscure area that we won't get much benefit out of it (people should fix > their __eq__ implementation to properly return NotImplemented) and changing > it would surely cause some mysterious breakage in some code we cannot > control. > > --Guido > > On Sat, Jul 20, 2019 at 7:31 AM Serhiy Storchaka <storch...@gmail.com> > wrote: > >> Usually the order of operands of the == operator does not matter. bool(a >> == b) should return the same as bool(b == a). Correct __eq__ should look >> like: >> >> def __eq__(self, other): >> if not know how to compare with other: >> return NotImplemented >> return the result of comparison >> >> But we work with non-perfect code written by non-perfect people. >> __eq__() can return False instead of NotImplemented for comparison with >> different type (it is not the worst case, in worst case it raises >> AttributeError or TypeError). So the order of operands can matter. >> >> See https://bugs.python.org/issue37555 as an example of a real world >> issue. >> >> The typical implementation of the __contains__ method looks like: >> >> def __contains__(self, needle): >> for item in self: >> if item == needle: # or needle == item >> return True >> return False >> >> The question is where the needle should be: at the right or at the left >> side of ==? >> >> In __contains__ implementations in list, tuple and general iterators >> (see PySequence_Contains) the needle is at the right side. But in >> count(), index() and remove() it is at the left side. In array it is >> effectively always at the left side since its __eq__ is not invoked. >> >> The question is whether we should unify implementations and always use >> the needle at some particular side and what this side should be. >> _______________________________________________ >> Python-Dev mailing list -- python-dev@python.org >> To unsubscribe send an email to python-dev-le...@python.org >> https://mail.python.org/mailman3/lists/python-dev.python.org/ >> Message archived at >> https://mail.python.org/archives/list/python-dev@python.org/message/VSV4K4AOKM4CBQMOELPFV5VMYALPH464/ >> > > > -- > --Guido van Rossum (python.org/~guido) > *Pronouns: he/him/his **(why is my pronoun here?)* > <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/> > _______________________________________________ > Python-Dev mailing list -- python-dev@python.org > To unsubscribe send an email to python-dev-le...@python.org > https://mail.python.org/mailman3/lists/python-dev.python.org/ > Message archived at > https://mail.python.org/archives/list/python-dev@python.org/message/WRNIZS3E4NO74JDANPGPX2JZEDHOTPFC/ >
_______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/KZI77A7BBXOHRNJSTHI5SOS3SV46PDRN/