[Python-ideas] 'Injecting' objects as function-local constants

Alex Light scialexlight at gmail.com
Wed Jun 15 17:48:55 CEST 2011


On Tue, Jun 14, 2011 at 5:27 PM, Jan Kaliszewski <zuo at chopin.edu.pl> wrote:
> Alex Light dixit (2011年06月14日, 13:44):
>> > >>> frmglobals = func.__globals__.copy()
> > >>> func.__globals__.update(localArgs)
> > >>> ret= func(*args, **kwargs)
> > >>> func.__globals__.clear()
> > >>> func.__globals__.update(frmglobals)
>> Changing global state on each call seems to be both
> concurrency-and-recurrency-unsafe and inefficient.
>
well some of your safety concerns can be allayed, i hope, by replacing this
snipet:
>>> frmglobals = func.__globals__.copy()
>>> func.__globals__.update(localArgs)
>>> ret= func(*args, **kwargs)
>>> func.__globals__.clear()
>>> func.__globals__.update(frmglobals)

with this one:
>>> with _modifyGlobals(func.__globals__, localArgs):
>>> ret = func(*args, **kwargs)

with _modifyGlobals defined as:
>>>from contextlib import contextmanager
>>>>>>@contextmanager
>>>def _modifyGlobals(glbls, additions):
>>> frmglbls = glbls.copy()
>>> try:
>>> glbls.update(additions)
>>> yield
>>> finally:
>>> glbls.clear()
>>> glbls.update(frmglbls)

as for performance you are correct that it is more efficient to just use
global variables.
the dictionary updates add about 1 x 10**-4 (or, if the check for collisions
with KWargs is removed, 5 x 10**-5)
seconds to the run time of a function, at least on this computer.
so not terribly significant just be sure to use sparingly
also with the link you mentioned i could not seem to get it to work.
Whenever i tried to use any built-in functions
it would start throwing NameErrors. also that is only useful if you want to
inject all global variables into the function.
--Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20110615/d9179001/attachment.html>


More information about the Python-ideas mailing list

AltStyle によって変換されたページ (->オリジナル) /