On Nov 9, 2:32 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote: > If I run the following code: > > class path(object): > def __init__(self, **subdirs): > for name, path in subdirs.iteritems(): > def getpath(): > return path > setattr(self, name, getpath) > > export = path( > one = 'this is one', > two = 'this is two', > ) > > print "invoking", export.one, export.one() > print "invoking", export.two, export.two() > > I get this output: > > invoking <function getpath at 0x400ded14> this is one > invoking <function getpath at 0x400ded84> this is one > > So there apparently are two definitions of the function "getpath" (the > addresses are different, anyway), but they seem to have the same value > for the binding of "path". It's not clear to me, after reading what I > can find about python name binding, whether this is the expected > behavior, or not (although I was surprised).
Clearly it wasn't the expected behaviour, or you wouldn't be surprised :) It's behaving as defined though, and the usual work-around is to add a variable with a default value. class path(object): def __init__(self, **subdirs): for name, path in subdirs.iteritems(): def getpath(path=path): return path setattr(self, name, getpath) -- Paul Hankin -- http://mail.python.org/mailman/listinfo/python-list