checking if two things do not equal None

Dave Angel davea at davea.name
Sat Mar 29 23:01:03 CET 2014

``` Roy Smith <roy at panix.com> Wrote in message:
> In article <lh7cb4\$ntu\$2 at news.albasani.net>,
>  Johannes Bauer <dfnsonfsduifb at gmx.de> wrote:
>
>> On 29.03.2014 20:05, Steven D'Aprano wrote:
>> > On Sat, 29 Mar 2014 11:56:50 -0700, contact.trigon wrote:
>> >
>> >> if (a, b) != (None, None):
>> >> or
>> >> if a != None != b:
>> >>
>> >> Preference? Pros? Cons? Alternatives?
>> >
>> > if not (a is b is None): ...
>> >
>> > Or if you prefer:
>> >
>> > if a is not b is not None: ...
>>
>> Is this an obfuscated coding contest? Why do you opt for a solution that
>> one has to at least think 2 seconds about when the simplest solution:
>>
>> if (a is not None) or (b is not None):
>>
>> is immediately understandable by everyone?
>
> I agree with that.  But
>
>> if (a, b) != (None, None):
>
> seems pretty straight-forward to me too.  In fact, if anything, it seems
> easier to understand than
>
>> if (a is not None) or (b is not None):
>
> I certainly agree that things like
>
>> if a is not b is not None: ...
>
> belong in an obfuscated coding contest.  Code gets read a lot more often
> than it get written.  Make it dead-ass simple to understand, and future
> generations of programmers who inherit your code will thank you for it.
>

The other advantage to keeping it simple is it's more than likely
to be right.  If we take the original form as the spec, we'll
find that two of the alternatives are not even equivalent.

def trigon1(a, b):
return (a,b) != (None, None)  #master

def trigon2(a, b):
return a != None != b.  #    different

def steven1(a, b):
return not(a is b is None)

def steven2(a, b):
return a is not b is not None  #different

def johannes(a, b):
return (a is not None) or (b is not None)

table = [
trigon1,
trigon2,
steven1,
steven2,
johannes
]

for func in table:
print func.__name__
print func(None, None), func(None, 42), func(42, None),
func(42, 42), func(42, "never")

--
DaveA

```