Anonymus functions revisited

Kay Schluehr kay.schluehr at gmx.net
Wed Mar 23 09:31:38 EST 2005


Ron wrote:

> On 23 Mar 2005 10:13:16 GMT, Duncan Booth
> <duncan.booth at invalid.invalid> wrote:
>
>
>> Do I really need to mention that the whole concept here is broken.
This
>> only works if you call it from global scope. If you call it from
inside a
>> function it [usually] won't work:
>>
>
>
> That's only becuase it was asked to go up 1 frame, and not 2.
>
> def makeVars(**nameVals):
>    sys._getframe(2).f_locals.update(nameVals) # <- get 2 frames up.
>
>    def test():
>    try: b
>    except NameError: print "Before makeVars: NameError"
>    else: print "Before makeVars: Not NameError"
>    makeVars(b=2)
>    try: b
>    except NameError: print "After makeVars: NameError"
>    else: print "After makeVars: Not NameError"
>
>
> import sys
> test()
>
>
> Before makeVars: NameError
> After makeVars: Not NameError
>
>

That's true only because the globals are updated by {"b":2}
two levels down.

If You nest the test() function You reproduce the error again:

def test():
   def inner():          try: b
       except NameError: print "Before makeVars: NameError"
       else: print "Before makeVars: Not NameError"
       makeVars(b=2)
       try: b
       except NameError: print "After makeVars: NameError"
       else: print "After makeVars: Not NameError"
   inner()


Before makeVars: NameError
After makeVars: NameError


A working makeVars seems not to be different from

def makeVars(**nameVals):
   globals().update(nameVals)


Regards Kay




More information about the Python-list mailing list