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