[Python-Dev] Multiple expression eval in compound if statement?
Guido van Rossum
gvanrossum at gmail.com
Mon Jun 13 05:05:59 CEST 2005
On 6/12/05, Skip Montanaro <skip at pobox.com> wrote:
>
> I'm horsing around with recognizing switch-like if statements like:
>
> if x == 1:
> print 1
> elif x == 2:
> print 2
> else:
> print "unknown"
>
> in the compiler and generating O(1) code. "x" can be any expression, but
> must be precisely the same in each elif clause, the comparison operator must
> be "==" and the RHS of the test must evaluate to a simple hashable constant
> (string, float, integer - still working on None, constant tuples may be
> allowed later). I can currently recognize such constructs and am working on
> code generation.
Cool!
> This would represent a semantic change to the Python runtime, because x
> would only be evaluated once, whereas in existing usage it can potentially
> be evaluated many times. If evaluating x has side-effects, code like the
> above that currently works would break.
>
> In reading the language reference manual, it says:
>
> It selects exactly one of the suites by evaluating the expressions one
> by one until one is found to be true (see section 5.10 for the
> definition of true and false); then that suite is executed (and no other
> part of the if statement is executed or evaluated). If all expressions
> are false, the suite of the else clause, if present, is executed.
>
> It says nothing about possibly caching values, which is what I'm doing
> effectively, but it seems pretty clear that each full test expression will
> be evaluated until one evaluates to true.
>
> I can't imagine anyone relying on a side-effect when evaluating x in this
> context, and if someone did, their code would be truly fragile. Still, any
> thought as to whether or not such a semantic change to the language might be
> acceptable?
I think it would be wiser if you only did this when x is a simple
local variable. For locals, we *know* that no side effect of any
expression can change the value.
--
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-Dev
mailing list