<div dir="auto"></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 16 Aug 2018, 12:44 Jacob Solinsky, <<a href="mailto:jacobsolinsky@gmail.com">jacobsolinsky@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">I wanted the called, jumped to function to change state in the caller. From what I tried to do, passing locals() cannot accomplish this. I have made it happen in other languages though.<div dir="auto">In the R language, one can do this</div><div dir="auto"><br></div><div dir="auto">foo = function(){</div><div dir="auto">       localenv = environment()</div><div dir="auto">       eval(bar, environment = localenv)</div><div dir="auto"><br></div><div dir="auto">The above code captures the environment of the calling function and executes the called function as if the calling function's local environment was the global environment. bar doesn't have to be a function, it can be any valid R expression captured with the expr() function, and everything in R is an expression thus allowing for the full usage code blocks. Outside of lisp-like languages this feat seems to usually be impossible though.<br><div dir="auto"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 16 Aug 2018, 12:34 Jonathan Fine, <<a href="mailto:jfine2358@gmail.com" target="_blank" rel="noreferrer">jfine2358@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Chris<br>
<br>
Steve and you wrote:<br>
<br>
>> there<br>
>> are times where I have really wanted to access the caller's environment,<br>
>> not the environment where my function was defined.<br>
<br>
> what am I missing? can't you get that by passing locals() in to a function?<br>
<br>
I think this will fail when values are changed. According to<br>
<a href="https://docs.python.org/3/library/functions.html#locals" rel="noreferrer noreferrer noreferrer" target="_blank">https://docs.python.org/3/library/functions.html#locals</a><br>
> The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.<br>
<br>
I suspect that Jacob, the original poster, wants to change state, and<br>
also to read changed state.  Jacob, could you confirm or correct, that<br>
you want the called function to be able to change state in caller (or<br>
perhaps even further up the stack).<br>
<br>
To finish, here's an interactive example of changing the value of locals().<br>
<br>
>>> def f(a=1): loc = locals(); yield loc; yield a<br>
>>> it = f()<br>
>>> ctx = next(it)<br>
>>> ctx<br>
{'a': 1}  ## This surprised me.<br>
>>><br>
>>><br>
>>> def f(a=1): loc = locals(); yield locals(); yield a<br>
>>> it = f()<br>
>>> ctx = next(it)<br>
>>> ctx<br>
{'a': 1, 'loc': {...}}<br>
>>> ctx['a'] = 3<br>
>>> ctx['loc']['a'] = 5<br>
>>> next(it) ## Is it 1 or 3 or 5?<br>
1  ## The value of 'a' hasn't changed.<br>
<br>
-- <br>
Jonathan<br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" rel="noreferrer noreferrer" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer noreferrer noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div>
</blockquote></div>