
On Tue, Aug 31, 2021 at 5:34 AM Nick Parlante <nick@cs.stanford.edu> wrote:
Hi Chris - thanks for the response,
so here you say:
I disagree; experienced programmers should be using "is" where it's correct.
I'd like to unpack that a little - like what do you mean by "correct" there. My guess is "correct" means the code gets the right answer for all inputs.
Like for "if x == None:" works right
By that definition, == is correct there. I think PEP8 has forced people to use "is" so much, they've lost touch with the reality that in fact == would work perfectly in almost all cases. Situations where "is" is required for correctness are very rare.
class X: def __eq__(self, other): return True Now your code is broken, because it will accept an instance of X when it should only be accepting None. It's also broken if you use numpy:
if numpy.array([1,2,3]) == None: pass ... Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
So, no, == is not correct. (Which reads weirdly, but it's still True, since correct is not the equals-equals operator.) These distinctions probably don't matter to a novice, but experienced programmers should know (or be able to figure out) whether they're looking for an identity check or an equality check. There are a few rules of thumb to help: 1) If you're comparing numbers or strings (Unicode or byte), use equality, because there could be multiple that have equivalent values. (Easiest to demonstrate with numbers since 5 == 5.0 == Fraction(5) == Decimal("5") but also true of strings in CPython.) 2) If you're checking for sentinel objects (None, Ellipsis, etc), use is. 3) Otherwise, use == unless you know you're doing an identity check. That'll cover most situations. I wouldn't bother teaching the distinction until you're looking at mutable objects (for instance, [] == [] because they currently have the same value, but if you append something to one of those lists, they won't; and you can use 'is' to figure out whether two things are actually the same list). ChrisA