NameError: how to get the name?

Yingjie Lan lanyjie at yahoo.com
Sat Apr 24 19:17:37 EDT 2010


--- On Sat, 4/24/10, Gary Herron <gherron at islandtraining.com> wrote:
> From: Gary Herron <gherron at islandtraining.com>
> Subject: Re: NameError: how to get the name?
> To: 
> Cc: python-list at python.org
> Date: Saturday, April 24, 2010, 8:03 PM
> Yingjie Lan wrote:
> > --- On Sat, 4/24/10, Steven D'Aprano <steve at REMOVE-THIS-cybersource.com.au>
> wrote:
> > 
> >   
> >> From: Steven D'Aprano <steve at REMOVE-THIS-cybersource.com.au>
> >> Subject: Re: NameError: how to get the name?
> >> To: python-list at 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


      



More information about the Python-list mailing list