python3: accessing the result of 'if'

Nick Coghlan ncoghlan at iinet.net.au
Sun Jan 9 00:17:17 EST 2005


Carl Banks wrote:
> What if the condition you wanted to test wasn't the same as the thing
> you want to save?  In other words, how would you convert this?
> 
> . where:
> .     m = something()
> . if m > 20:
> .     do_something_with(m)

Yeah, this problem eventually occurred to me as well. However, I think a little 
utility function can help solve it:

   def test(val, condition):
     if condition(val):
       return val
      else:
       return None

   if test(something(), lambda x: x < 10) as m:
     print "Case 1:", m
   elif test(something(), lambda x: x > 20) as m:
     print "Case 2:", m
   else:
     print "No case at all!"

If we were to use a where clause instead, it looks like:

   if test(something(), less_than(10)) as m:
     print "Case 1:", m
   elif test(something(), more_than(20)) as m:
     print "Case 2:", m
   else:
     print "No case at all!"
   where:
     def less_than(y):
       def lt(x):
         return x < y
       return lt

     def more_than(y):
       def gt(x):
         return x > y
       return lt

This is an example of why I don't think where clauses would completely eliminate 
the utility of deferred expressions. Here's a version using my preferred syntax 
from the AlternateLambdaSyntax page:

   if test(something(), (def x < 10 from x)) as m:
     print "Case 1:", m
   elif test(something(), (def x > 20 from x)) as m:
     print "Case 2:", m
   else:
     print "No case at all!"

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at email.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://boredomandlaziness.skystorm.net



More information about the Python-list mailing list