NameError: how to get the name?

Yingjie Lan lanyjie at yahoo.com
Sun Apr 25 01:07:23 EDT 2010


--- On Sun, 4/25/10, Chris Rebert <clp2 at rebertia.com> wrote:

> From: Chris Rebert <clp2 at rebertia.com>
> Subject: Re: NameError: how to get the name?
> To: "Yingjie Lan" <lanyjie at yahoo.com>
> Cc: python-list at python.org
> Date: Sunday, April 25, 2010, 3:27 AM
> On Sat, Apr 24, 2010 at 4:17 PM,
> Yingjie Lan <lanyjie at yahoo.com>
> wrote:
> > --- On Sat, 4/24/10, Gary Herron <gherron at islandtraining.com>
> wrote:
> >> From: Gary Herron <gherron at islandtraining.com>
> >> 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:
> <snip>
> > Thanks for the information! BTW, why would
> > locals() and globals() differ in this respect?
> 
> The module-level (i.e. global) namespace is implemented by
> CPython
> using an actual dictionary; globals() returns a proxy to
> that
> dictionary and lets you manipulate it.
> In contrast, as an optimization, CPython implements local
> variables in
> functions using predetermined offsets into an array of
> predetermined
> length; the dictionary returned by locals() is dynamically
> constructed
> on-demand and does not affect the actual array used for the
> local
> variables (I suppose it could have been made to do so, but
> there's
> probably a complexity or optimization reason for why not).
> 

Thanks, that's good to know. The locals() behaves rather 
strangely, as can be demonstrated by the following two 
tests (the first one is from Steven, thanks Steve):

#file: fun.py:

def test():
    x = 1
    print (x)
    locals()['x'] = 2
    print (x, locals()['x'])

def test2():
    locals()['x'] = 2
    print (locals()['x'])
    print x

test()
test2()

-----And the output: python fun.py-------
1
(1, 1)
2
Traceback (most recent call last):
  File "fun.py", line 21, in <module>
    test2()
  File "fun.py", line 17, in test2
    print x
NameError: global name 'x' is not defined

-------------

I don't know how to make sense out of it.
Any suggestions? 

Yingjie


      



More information about the Python-list mailing list