[Info] PEP 308 accepted - new conditional expressions

Bengt Richter bokr at oz.net
Fri Sep 30 20:58:18 EDT 2005


On Fri, 30 Sep 2005 20:25:35 +0200, Reinhold Birkenfeld <reinhold-birkenfeld-nospam at wolke7.net> wrote:

>Fredrik Lundh wrote:
>> Reinhold Birkenfeld wrote:
>> 
>>> after Guido's pronouncement yesterday, in one of the next versions of Python
>>> there will be a conditional expression with the following syntax:
>>>
>>> X if C else Y
>>>
>>> which is the same as today's
>>>
>>> (Y, X)[bool(C)]
>> 
>> hopefully, only one of Y or X is actually evaluated ?
>
>(cough) Yes, sorry, it's not the same. The same would be
>
>(C and lambda:X or lambda:Y)()
>
>if I'm not much mistaken.

I think you need to parenthesize, but also note that using lambda does not
always grab the currently-executing-scope X or Y, so I think the list container idiom
may be better to show the semantics of the new expression:


 >>> X='this is global X'
 >>> Y='this is global Y'
 >>> C=False
 >>> def foo():
 ...     C = True
 ...     class K(object):
 ...         X='this is K.X'
 ...         Y='this is K.Y'
 ...         cv = (C and (lambda:X) or (lambda:Y))()
 ...     return K
 ...
 >>> def bar():
 ...     C = True
 ...     class K(object):
 ...         X='this is K.X'
 ...         Y='this is K.Y'
 ...         cv = (C and [X] or [Y])[0]
 ...     return K
 ...
 >>> foo().cv
 'this is global X'
 >>> bar().cv
 'this is K.X'


>
>>> C and X or Y (only if X is True)
>> 
>> hopefully, "only if X is True" isn't in fact a limitation of "X if C else Y" ?
>> 
>> /... snip comment that the natural order is C, X, Y and that programmers that
>> care about readable code will probably want to be extremely careful with this
>> new feature .../
>
>Yes, that was my comment too, but I'll not demonize it before I have used it.
>
Me too ;-)

Regards,
Bengt Richter



More information about the Python-list mailing list