Re: Python3 exec locals - this must be a FAQ

Discussion in 'Python' started by Dave Angel, Feb 12, 2013.

  1. Dave Angel

    Dave Angel Guest

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

    >
    >>> <snip>
    >>>
    >>> 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.


    The OP presumably wanted to restore the original values of the original
    variables. The above "assignment" won't help a bit with that.


    >
    > 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"].
    >


    My claim was based on the assumption that the earlier assignment had
    been fixed by some kind of copy. If not, there's nothing to restore.

    I also retracted my use of that trick anyway, since being corrected by
    MRAB. I only tested it in top-level code, not inside a function.


    --
    DaveA
     
    Dave Angel, Feb 12, 2013
    #1
    1. Advertising

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
    Replies:
    2
    Views:
    7,124
    Michel Claveau, résurectionné d'outre-bombe inform
    Jul 21, 2004
  2. Ted
    Replies:
    1
    Views:
    478
    Duncan Booth
    Jul 22, 2004
  3. Dave Angel
    Replies:
    2
    Views:
    147
    Steven D'Aprano
    Feb 13, 2013
  4. MRAB
    Replies:
    0
    Views:
    124
  5. Terry Reedy
    Replies:
    0
    Views:
    136
    Terry Reedy
    Feb 12, 2013
Loading...

Share This Page