[Python-Dev] once [was: Simple Switch statementZ]
Ron Adam
rrr at ronadam.com
Wed Jun 28 23:24:22 CEST 2006
> I believe at least one poster has pointed out that 'once' (if defined
> suitably) could be used as a better way to do this:
>
> def index_functions(n):
> return [(lambda: once i) for i in range(n)]
>
> But delaying the evaluation of the once argument until the function is
> called would break this, since none of these functions are called
> until after the loop is over, so the original bug would be back.
I've been trying to sort out the different terms once, const, and
static. Below is what feels right to me. Not that it is right, but how
I think I would interpret them as if I were new to python and what would
be easiest to understand.
The "once" below isn't what is being discussed but it seems to me what
the word implies.
once = Evaluate an expression once and use that value in place of the
expression if the same line is executed again.
for n in range(10):
print n # print 0 through 9
for n in range(10):
print (once n) # prints 0 ten times
a = (once 3 * pi) # replaces 3 * pi with value
b = i + (once sum(range(10))) # evaluate 'sum()' only once
# use the result many times
# in a loop
const = Bind a name to a value and protect it from further change in the
current scope at execution time. This protects the name, but not the
object. A constant mutable is still mutable. The name just can't be
rebound to another object.
def foo(i):
i += 1 # this is ok
const i # it becomes locked at this point
i = 2 # this gives an exception
static = Evaluate an expression at function compile time. Any values in
the expression need to be known at function compile time. They can be
static names in the current scope previously evaluated.
a, b = 1, 2
def foo(i):
static j = a+b
static k = j*2
k = 25 # ok if not also const
const j # protect it from further change
j = 12 # give an exception
The term static does seem to suggest lack of change, so it could also
have the const property by default. If it were allowed to be changed,
then would it keep the changed value on the next call? Probably not a
good idea for the use cases being discussed.
So given the above only the static version solves the above lambda loop
and returns a list of functions that return values 0 through n.
I think all three of these properties are useful, but I don't think we
need all three of them.
Cheers,
Ron
(* I'll be away from my computer for about a week after Tomorrow morning.)
More information about the Python-Dev
mailing list