Re: Default if none

2010-04-29 Thread Steven D'Aprano
On Thu, 29 Apr 2010 04:12:29 -0700, Astley Le Jasper wrote:

> ... oh ... that simple. Now I feel dumb.

It's really difficult to tell what you're talking about, but I assume 
that you're talking about Chris' solution:

x or y or z

Be careful, as Chris' solution is rather risky (read his disclaimer 
again). And the code you give does NOT solve the question you ask. Have 
you tested it with something like this?

>>> default_if_none(0) == 0
False
>>> default_if_none(0) is None
True

Your code destroys perfectly legitimate values and replaces them with 
None. That's almost certainly not what you actually want. Chris' solution 
isn't much better, but he warned you about it. Read his post carefully.

>>> x, y, z = 0, None, None
>>> x or y or z == 0
False
>>> x or y or z is None
True


What are you trying to accomplish? Return the first arg that is not None, 
otherwise return None? You need to code your test more carefully, by 
testing for None and nothing but None:

def default_if_none(*args):
for arg in args:
if arg is not None:
return arg

You don't need the "return None" at the end, because all Python functions 
do that automatically.

Here is a one-liner to do it:

(filter(lambda x: x is not None, args) or [None])[0]

but frankly the one-liner is ugly and I wouldn't use it. Just use the 
function.



-- 
Steven
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Default if none

2010-04-29 Thread Chris Rebert
On Thu, Apr 29, 2010 at 12:01 PM, Michel Claveau - MVP
 wrote:
> Hi!
>
>> print x or y or z
>> If none of the potential values are considered boolean false
>
> But :
>  a=None
>  b=False
>  c=None
>  print a or b or c
>  > None

Consider:

def read_default_from_config(cfg_file):
#pseudocode
if not_specified_in(cfg_file):
return None
return read_value_from(cfg_file)

a = None
b = read_default_from_config("1.cfg")
c = read_default_from_config("2.cfg")

print a or b or c

Now, what happens when the user puts a default of 0 in 1.cfg? This was
my intended point.

Cheers,
Chris
--
http://blog.rebertia.com
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Default if none

2010-04-29 Thread Michel Claveau - MVP
Re! 

Look also : 
  >>> print False or None
  None
  >>> print None or False
  False

-- 
MCI
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Default if none

2010-04-29 Thread Michel Claveau - MVP
Hi!

> print x or y or z
> If none of the potential values are considered boolean false

But :
  a=None
  b=False
  c=None
  print a or b or c
  > None



@-salutations
-- 
Michel Claveau 

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Default if none

2010-04-29 Thread Astley Le Jasper
... oh ... that simple. Now I feel dumb.

Thanks!

ALJ
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Default if none

2010-04-29 Thread Chris Rebert
On Thu, Apr 29, 2010 at 3:16 AM, Astley Le Jasper
 wrote:
> I realise I could roll my own here, but I wondered if there was an
> inbuilt version of this?
>
>>.
> def default_if_none(*args):
>    for arg in args:
>        if arg:
>            return arg
>    return None
>
> x = None
> y = 5
> z = 6
>
> print default_if_none(x,y,z)

If none of the potential values are considered boolean false:

print x or y or z

Cheers,
Chris
--
http://blog.rebertia.com
-- 
http://mail.python.org/mailman/listinfo/python-list


Default if none

2010-04-29 Thread Astley Le Jasper
I realise I could roll my own here, but I wondered if there was an
inbuilt version of this?

>.
def default_if_none(*args):
for arg in args:
if arg:
return arg
return None

x = None
y = 5
z = 6

print default_if_none(x,y,z)

>> 5

-- 
http://mail.python.org/mailman/listinfo/python-list