A critic of Guido's blog on Python's lambda

Boris Borcic bborcic at gmail.com
Thu May 11 14:11:04 EDT 2006


jayessay wrote:
> "Michele Simionato" <michele.simionato at gmail.com> writes:
> 
>> jayessay wrote:
>>> I was saying that you are mistaken in that pep-0343 could be used to
>>> implement dynamically scoped variables.  That stands.
>> Proof by counter example:
>>
>> from __future__ import with_statement
>> import threading
>>
>> special = threading.local()
>>
>> def getvar(name):
>>     return getattr(special, name)
>>
>> def setvar(name, value):
>>     return setattr(special, name, value)
>>
>> class dynamically_scoped(object):
>>     def __init__(self, name, value):
>>         self.name = name
>>         self.value = value
>>     def __context__(self):
>>         return self
>>     def __enter__(self):
>>         self.orig_value = getvar(self.name)
>>         setvar(self.name, self.value)
>>     def __exit__(self, Exc, msg, tb):
>>         setvar(self.name, self.orig_value)
>>
>> if __name__ == '__main__': # test
>>     setvar("*x*", 1)
>>     print getvar("*x*") # => 1
>>     with dynamically_scoped("*x*", 2):
>>         print getvar("*x*") # => 2
>>     print getvar("*x*") # => 1
>>
>> If you are not happy with this implementation, please clarify.
> 
> I can't get this to work at all - syntax errors (presumably you must
> have 2.5?, I only have 2.4).  But anyway:
> 
> This has not so much to do with WITH as relying on a special "global"
> object which you must reference specially, which keeps track (more or
> less) of its attribute values, which you use as "faked up" variable
> Actually you probably need to hack this a bit more to even get that as
> it doesn't appear to stack the values beyond a single level.

Actually there's no problem there. hint : dynamically_scoped is a class that the 
with statement will instantiate before (any) entry. OTOH, as it is written, I am 
not convinced it will work in a multithreaded setting : isn't it the case that 
all threads that will import eg dynamically_scoped/getvar/setvar will act 
without sync on the /single/ special object of the /single/ thread that 
initialized the module ?

But I'm not sure, it's been ages since I used python threading.

> 
> 
> /Jon
> 



More information about the Python-list mailing list