
For anyone finding this on a later search, note that he still uses a closure; just a slightly neater one. Within a function, there is no way to refer to the function itself, except by name -- and that name may well have been reassigned to something else. A more local enclosure protects against that reassignment. -jJ On 3/18/10, spir <denis.spir@gmail.com> wrote:
On Thu, 18 Mar 2010 00:19:40 -0700 Chris Rebert <pyideas@rebertia.com> wrote:
Are function attributes used *that* much?
I use them as a nice (& explicit, & clear) alternative to closures, esp. for func factories, eg:
def powerN(n): def f(x): return x ** f.n f.n = n return f power3 = powerN(3) for i in range(1,10): print "%s:%s" %(i,power3(i)), # ==> 1:1 2:8 3:27 4:64 5:125 6:216 7:343 8:512 9:729
I find this conceptually much more satisfying than the following, since the parameter really is an attribute of the function (also, like a real upvalue, it can be explicetely updated).
def powerN(n): def f(x,n=n): # ugly ;-) return x ** n return f
(Let us use the opportunity that python funcs are real objects :-)
A "parameterisable" generator factory:
def powers(n, start=1, stop=None): def f(): while True: f.i += 1 if f.stop and f.i >= f.stop: raise StopIteration yield (f.i, f.i ** f.n) f.n = n f.i = start-1 f.stop = stop return f for (i,x) in powers(3, 1,10)(): print "%s:%s" %(i,x), # ==> 1:1 2:8 3:27 4:64 5:125 6:216 7:343 8:512 9:729
Denis ________________________________
vit e estrany
spir.wikidot.com
_______________________________________________ Python-ideas mailing list Python-ideas@python.org http://mail.python.org/mailman/listinfo/python-ideas