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/

Reply via email to