--- On Sat, 4/24/10, Gary Herron <gher...@islandtraining.com> wrote: > From: Gary Herron <gher...@islandtraining.com> > Subject: Re: NameError: how to get the name? > To: > Cc: python-list@python.org > Date: Saturday, April 24, 2010, 8:03 PM > Yingjie Lan wrote: > > --- On Sat, 4/24/10, Steven D'Aprano <st...@remove-this-cybersource.com.au> > wrote: > > > > > >> From: Steven D'Aprano <st...@remove-this-cybersource.com.au> > >> Subject: Re: NameError: how to get the name? > >> To: python-list@python.org > >> Date: Saturday, April 24, 2010, 4:07 PM > >> On Sat, 24 Apr 2010 04:19:43 -0700, > >> Yingjie Lan wrote: > >> > >> > >>> I wanted to do something like this: > >>> > >>> while True: > >>> try: > >>> def fun(a, b=b, c=c): > pass > >>> except NameError as ne: > >>> name = > get_the_var_name(ne) > >>> locals()[name] = '' > >>> else: break > >>> > >> This won't work. Writing to locals() does not > actually > >> change the local variables. Try it inside a > function, and you will see it > >> doesn't work: > >> > >>
No it DOESN'T work, and both of you are precisely correct. Just for playing around, I substituted "locals()" by "globals()" and it worked as desired: ============================================ def wrapfun(): while True: try: print a except: globals()['a']="HERE YOU ARE" else: break finally: print globals()['a'] wrapfun() ============================================ Thanks for the information! BTW, why would locals() and globals() differ in this respect? For example: ============================================ def wrapfun(): while True: try: print a except: locals()['a']="HERE YOU ARE" else: break finally: print locals()['a'] wrapfun() ============================================ That would print "HERE YOU ARE" infinitely. Apparently, the dict gets modified, but is not the same as the one actually used to resolve name 'a' in the statement 'print a'. Yingjie -- http://mail.python.org/mailman/listinfo/python-list