missing 'xor' Boolean operator

Ethan Furman ethan at stoneleaf.us
Wed Jul 15 01:48:26 CEST 2009


Christian Heimes wrote:
> Chris Rebert wrote:
> 
>>Using the xor bitwise operator is also an option:
>>bool(x) ^ bool(y)
> 
> 
> I prefer something like:
> 
>     bool(a) + bool(b) == 1
> 
> It works even for multiple tests (super xor):
> 
>   if bool(a) + bool(b) + bool(c) + bool(d) != 1:
>       raise ValueError("Exactly one of a, b, c and d must be true")
> 
> Christian
> 

super_xor!  I like it!

In [23]: def super_xor(args, failure=False):
    ....:     found_one = False
    ....:     for item in args:
    ....:         if item:
    ....:             if found_one:
    ....:                 return failure
    ....:             else:
    ....:                 found_one = item
    ....:     return found_one or failure

In [25]: super_xor((0, 1, 0, []))
Out[25]: 1

In [26]: super_xor((0, 1, 0, [],('this',)))
Out[26]: False

In [27]: super_xor((0, {}, 0, [],()))
Out[27]: False

In [16]: def super_or(args, failure=False):
    ....:     for item in args:
    ....:         if item:
    ....:             return item
    ....:     else:
    ....:         return failure
    ....:

In [17]: super_or((None, [], 0, 3, {}))
Out[17]: 3

In [18]: super_or((None, [], 0, (), {}))
Out[18]: False

In [19]: def super_and(args, failure=False):
    ....:     for item in args:
    ....:         if not item:
    ....:             return failure
    ....:     else:
    ....:         return item
    ....:

In [20]: super_and((1, 2, 3))
Out[20]: 3

In [21]: super_and((1, 2, 3, 4))
Out[21]: 4

In [22]: super_and((1, 0, 3, 4))
Out[22]: False

A whole family of supers.  :)

~Ethan~



More information about the Python-list mailing list