Re: Python3 exec locals - this must be a FAQ

Discussion in 'Python' started by Terry Reedy, Feb 12, 2013.

  1. Terry Reedy

    Terry Reedy Guest

    On 2/12/2013 8:27 AM, Dave Angel wrote:
    > On 02/12/2013 06:46 AM, Helmut Jarausch wrote:

    >> I've tried but didn't find an answer on the net.

    You should start with the fine manual, which is on the net as well as
    included with at least the Windows distribution. It has a nice index
    that includes an entry for locals (built-in function).

    >> The exec function in Python modifies a copy of locals() only.
    >> How can I transfer changes in that local copy to the locals of my
    >> function
    >> ** without ** knowing the names of these variables.

    You cannot. Just accept that.

    >> E.g. I have a lot of local names.
    >> Doing
    >> _locals= locals()

    This merely gives you a handle of the dict returned by locals() for when
    you want to do more than just pass it to (for example) exec). This is
    unusual because it is not very useful.

    > This doesn't copy everything.

    I have no idea what you mean. The locals() dict contains all local and
    nonlocal names, excluding global names, which are in the globals() dict.

    >> expr=compile(input('statements assigning to some local variables '),
    >> 'user input','exec')
    >> exec(expr,globals(),_locals)
    >> How can I "copy" the new values within _locals to my current locals.
    >> If I knew that Var1 has changed I could say
    >> Var1 = _locals['Var1'] but what to do in general?

    If you want to put a value back into the function local namespace, this
    is the only thing you can do. In CPython, at least, all function local
    names must be explicit and known when the function statement is executed
    and the function object is created. Read the Library manual entry for
    locals(), including the highlighted note.

    > locals()["Var1"] = _locals["Var1"] will set the same Var1 local.

    Huh??? The dict returned by this locals call is the same dict returned
    by the previous locals call and bound to _locas. So the above does
    nothing. It is the same thing as _locals["Var1"] = _locals["Var1"].

    Terry Jan Reedy
    Terry Reedy, Feb 12, 2013
    1. Advertisements

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. tedsuzman
    Michel Claveau, résurectionné d'outre-bombe inform
    Jul 21, 2004
  2. Ted
    Duncan Booth
    Jul 22, 2004
  3. Dave Angel
    Steven D'Aprano
    Feb 13, 2013
  4. MRAB
  5. Dave Angel
    Dave Angel
    Feb 12, 2013

Share This Page