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~

```