# None or 0

Bengt Richter bokr at oz.net
Sat Sep 7 15:27:07 EDT 2002

```On Sat, 07 Sep 2002 17:23:00 +0200, =?ISO-8859-1?Q?Michael_Str=F6der?= <michael at stroeder.com> wrote:

>HI!
>
>I'm using the idiom
>
>a = a or b
>
>to get rid of statements like
>
>if a is None:
>   a = b
>
>Now I wonder what happens if both a and b have zero-length values.
>
>Trying in Python 2.2.1 reveals:
>
> >>> repr(0 or None)
>'None'
> >>> repr(None or 0)
>'0'
> >>> repr('' or None)
>'None'
> >>> repr(None or '')
>"''"
> >>>
>
>Is it guaranteed to work like this or should that be avoided?
>

If you want a statement that sets a to a if a is not None and otherwise b,

a = a or b

is not good, as you can infer from what you show above.

a = (a, b)[a is None]

should do it, but

if a is None: a = b

is better as a statement. If you need it in expression context, you could
use the

(a, b)[a is None]	# alternatively, [a, b][a is None]

or maybe

def myAorB(a, b):
if a is None: return b
return a
...
myAorB(a, b)

For the following combinations, a or b obviously (when they're
distinguishable ;-) always produces b, and (a,b)[a is None] always
produces a except when a is None, in which case it produces b.

>>> for a in [None, 0, '', [], (), {}]:
...     for b in [None, 0, '', [], (), {}]:
...         print 'a=%-5s b=%-8s a or b => %-8s  (a,b)[a is None] => %s' % (
...             `a`, `b`, `a or b`, `(a, b)[a is None]`
... )
...
a=None  b=None     a or b => None      (a,b)[a is None] => None
a=None  b=0        a or b => 0         (a,b)[a is None] => 0
a=None  b=''       a or b => ''        (a,b)[a is None] => ''
a=None  b=[]       a or b => []        (a,b)[a is None] => []
a=None  b=()       a or b => ()        (a,b)[a is None] => ()
a=None  b={}       a or b => {}        (a,b)[a is None] => {}
a=0     b=None     a or b => None      (a,b)[a is None] => 0
a=0     b=0        a or b => 0         (a,b)[a is None] => 0
a=0     b=''       a or b => ''        (a,b)[a is None] => 0
a=0     b=[]       a or b => []        (a,b)[a is None] => 0
a=0     b=()       a or b => ()        (a,b)[a is None] => 0
a=0     b={}       a or b => {}        (a,b)[a is None] => 0
a=''    b=None     a or b => None      (a,b)[a is None] => ''
a=''    b=0        a or b => 0         (a,b)[a is None] => ''
a=''    b=''       a or b => ''        (a,b)[a is None] => ''
a=''    b=[]       a or b => []        (a,b)[a is None] => ''
a=''    b=()       a or b => ()        (a,b)[a is None] => ''
a=''    b={}       a or b => {}        (a,b)[a is None] => ''
a=[]    b=None     a or b => None      (a,b)[a is None] => []
a=[]    b=0        a or b => 0         (a,b)[a is None] => []
a=[]    b=''       a or b => ''        (a,b)[a is None] => []
a=[]    b=[]       a or b => []        (a,b)[a is None] => []
a=[]    b=()       a or b => ()        (a,b)[a is None] => []
a=[]    b={}       a or b => {}        (a,b)[a is None] => []
a=()    b=None     a or b => None      (a,b)[a is None] => ()
a=()    b=0        a or b => 0         (a,b)[a is None] => ()
a=()    b=''       a or b => ''        (a,b)[a is None] => ()
a=()    b=[]       a or b => []        (a,b)[a is None] => ()
a=()    b=()       a or b => ()        (a,b)[a is None] => ()
a=()    b={}       a or b => {}        (a,b)[a is None] => ()
a={}    b=None     a or b => None      (a,b)[a is None] => {}
a={}    b=0        a or b => 0         (a,b)[a is None] => {}
a={}    b=''       a or b => ''        (a,b)[a is None] => {}
a={}    b=[]       a or b => []        (a,b)[a is None] => {}
a={}    b=()       a or b => ()        (a,b)[a is None] => {}
a={}    b={}       a or b => {}        (a,b)[a is None] => {}

Regards,
Bengt Richter

```