Which make me wonder what plans there are for providing a better mechanism than default arguments as a way of initializing local function variables. Nested def's to create a closure with initialized values is pretty crufty for that, IMO.
What about using a class? Associating functions with data is pretty much what they're for...
Maybe extending the default argument space with whatever comes after e.g. a triple star delimiter in the argument list, but which wouldn't be counted as part of the normal arguments? E.g.,
def foo(x, y=123, *args, **kw, *** i=1, deftime=time.ctime()): return x*y, kw.get('which_time')=='now' and time.ctime() or deftime
If what you want is to have i=1 and deftime=time.ctime() available within foo, you could do something like (untested):
class foo(object): def __init__(self): self.i = 1 self.deftime = time.ctime() def __call__(self, x, y=123, *args, **kwds): return x*y, (kw.get('which_time') == 'now' and time.ctime() or self.deftime) foo = foo()
Or if you don't like 'foo = foo()', you could probably abuse the __new__ method (also untested):
class foo(object): i = 1 deftime = time.ctime() def __new__(cls, x, y=123, *args, **kwds): return x*y, (kw.get('which_time') == 'now' and time.ctime() or self.deftime)
I guess my point is that if you want attribute associated with the function, it's often easy enough to write a class instead...
Steve -- http://mail.python.org/mailman/listinfo/python-list