Alternative suggestion for conditional expressions (see PEP 308)

Colin J. Williams cjw at sympatico.ca
Fri Jul 16 09:49:22 EDT 2004


I was inclined to support PEP 308, but now wonder whether it's really 
needed.

sColorName = ("Black","White")[Color == COLOR_WHITE]

Could be:

sColorName = Color == COLOR_WHITE and "Black" or "White"

which takes avantantage of the short circuit evaluation

sColorName= color == colorwhite and "white" or garbage

This gives the correct result when only the first case needs to be 
evalutated.

Colin W.

neblackcat wrote:
> Would anyone like to comment on the following idea?
> 
> I was just going to offer it as a new PEP until it was suggested that
> I post it here for comment & consideration against PEP 308.
> 
> I'm far from being a "language internist" (on Python or anything else)
> so go easy on me if this is stupid - it just seemed quite elegant to
> me as a relative newbie in town :-)
> 
> I also havent got a clue whether this would be easy or even possible
> to implement even if it was deemed a reasonable idea.
> 
> -----------------------------------------------------------------------
> 
> Abstract
> 
>     Implement C-like conditional expressions, but in a more
>     flexible and "Python-like" way.
>    
> Motivation
> 
>     The lack of conditional expressions combined with the lack
>     of a 'switch' statement in Python tends to result in lots
>     of 'if'/'elif' lines which often arent needed and which make 
>     code more verbose and sometimes (where there are a lot of 
>     them) harder to follow and more prone to mistakes than it 
>     needs to be.  
> 
>     This PEP attempts to address that by proposing a
>     'Pythonesque' conditional expressions language feature
>     which fits well with existing language features
>     and the way that conditional expressions are often
>     simulated in current Python code by using temporary
>     tuples, lists or dictionaries.
> 
> 
> Rationale
> 
>     It is currently possible to simulate conditional
>     expressions in Python using constructs with
>     temporary tuples/lists, such as:
> 
>     sColorName = ("Black","White")[Color == COLOR_WHITE]
> 
>     This works, but has two disadvantages:
> 
>     i)  it involves packing and unpacking of a 'temporary'
>         tuple, eg. ("Black","White") in the above, which
>         has performance implications
> 
>     ii) this in turn means that *all* of the possible 
>         final values have to be valid (not just the one
>         which will be actually selected), which is often
>         not the case in a more real-world example, eg:
> 
>         r = (DEFAULT_RESULT, Database.Results[index])
>               [IsValid(index)]
> 
>         In the above, 'Database.Results[index]' isn't
>         defined to be valid if the 'index' value isn't,
>         which means that this technique cant be used. 
> 
> Specification
> 
>     I therefore suggest a variation on the above
>     syntax such as:
> 
>     sColorName = ?("Black","White")[Color == COLOR_WHITE]
> 
>     where the '?' identifies the immediately following
>     tuple as a "conditional tuple" in which the tuple is 
>     not actually fully evaluated/stored.  Instead,
>     only the element specified  by the immediately following
>     index expression is evaluated and must be valid.
> 
>     This syntax could also apply to other sequence types,
>     for example dictionaries:
> 
>     sColorName = ?{COLOR_RED:"Red", 
>                    COLOR_BLUE:"Blue",
>                    COLOR_GREEN:"Green"}[ColorValue]
> 
>     Again, the conditional sequence is not fully evaluated/stored,
>     so it doesnt matter if it is large and/or has members which
>     arent evaluated given an index value which doesnt actually
>     select them.
> 
>     Obviously, the above are just simple examples.




More information about the Python-list mailing list