Prev: [suds] how to convert a sudsobject into its representative XML?
Next: Jewish Pirates of the Mediteranean
From: Ryan Kelly on 17 Jun 2010 19:55 On Thu, 2010-06-17 at 16:02 -0400, python(a)bdurham.com wrote: > Is there an elegant way to reach back in the stack and grab the > calling function's copy of locals()? You can do it using my favourite function, sys._getframe: >>> import sys >>> >>> def outer(): .... a = 1 .... inner() .... >>> >>> def inner(): .... print sys._getframe(1).f_locals .... >>> >>> outer() {'a': 1} >>> The dict so obtained is of course read-only. If you like I can show you the black magic necessary to *write* to the local variables of the calling function, but it ain't pretty :-) > I'm working on a library that does lots of textmerge operations and am > looking for a way to eliminate the need for many of the calls to our > library to have to explictly pass locals() to our formatting > functions. I understand the desire, but that sounds like trouble to me. Explicit is better than implicit and all that. You might get away with it for purely internal code (heck, even the standard library uses sys._getframe on occasion!) but I would hesitate to have a public-facing API that snaffles locals from any function that happens to call it. Cheers, Ryan -- Ryan Kelly http://www.rfk.id.au | This message is digitally signed. Please visit ryan(a)rfk.id.au | http://www.rfk.id.au/ramblings/gpg/ for details
From: python on 18 Jun 2010 14:12
Ryan, Thank you very much - your example is exactly the technique I was looking for. My use case is unusual and we don't need to update the parent's version of locals(). The code in question is an internal template library whose methods need access to their caller's locals() so they can figure out how to expand variable references in string expressions. Eventually this library will be replaced with a more conventional template package; however, for the moment, I'm just keeping what we currently have working smoothly :) Cheers, Malcolm |