On Saturday, October 13, 2012, Cameron Simpson wrote: > I'm having some trouble with closures when defining a decorator.
<snip> > However, I can't make my make_file_property function work. I've stripped > the code down and it does this: <snip> > Traceback (most recent call last): > File "foo.py", line 21, in <module> > def f(self, foo=1): > File "foo.py", line 4, in file_property > return make_file_property()(func) > File "foo.py", line 10, in made_file_property > if attr_name is None: > UnboundLocalError: local variable 'attr_name' referenced before > assignment > > Observe above that 'unset_object' is in locals(), but not 'attr_name'. > This surprises me. > > The stripped back code (missing the internals of the file property > watcher) looks like this: > > import sys > > def file_property(func): > return make_file_property()(func) > > def make_file_property(attr_name=None, unset_object=None, poll_rate=1): > print >>sys.stderr, "make_file_property(attr_name=%r, unset_object=%r, > poll_rate=%r): locals()=%r" % (attr_name, unset_object, poll_rate,locals()) > def made_file_property(func): You're missing a "nonlocal" declaration here. print >>sys.stderr, "made_file_property(func=%r): locals()=%r" % > (func, locals()) > if attr_name is None: > attr_name = '_' + func.__name__ You assign to it, but there's no nonlocal declaration, so Python thinks it's a local var, hence your error. Pardon my brevity and some lack of trimming; I'm on a smartphone and in a rush. - Chris lock_name = attr_name + '_lock' > def getprop(self): > with getattr(self, lock_name): > # innards removed here > pass > return getattr(self, attr_name, unset_object) > return property(getprop) > return made_file_property > > @file_property > def f(self, foo=1): > print "foo=%r" % (foo,) > > @make_file_property(attr_name="_blah") > def f2(self, foo=2): > print "foo=%r" % (foo,) > > Can someone explain what I'm doing wrong, or tell me this is a python > bug? > -- > Cameron Simpson <c...@zip.com.au <javascript:;>> > > Bolts get me through times of no courage better than courage gets me > through times of no bolts! > - Eric Hirst <e...@u.washington.edu <javascript:;>> > -- > http://mail.python.org/mailman/listinfo/python-list > -- Cheers, Chris -- http://rebertia.com
-- http://mail.python.org/mailman/listinfo/python-list