Jeremy Sanders wrote: > Hi - > > I'm trying to subclass a dict which is used as the globals environment of > an eval expression. For instance: > > class Foo(dict): > def __init__(self): > self.update(globals()) > self['val'] = 42 > > def __getitem__(self, item): > # this doesn't get called from the eval statement > print "*", item > return dict.__getitem__(self, item) > > a = Foo() > > print a['val'] > print eval('val*2+6', a) > > The first print statements also prints "* val", but __getitem__ is never > called by the evaluation in the eval statement. > > Is this a bug? Does anyone have an idea for a workaround? I'm using > Python 2.3.3.
Try Python 2.4.1: Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> class Foo(dict): ... def __init__(self): ... self.update(globals()) ... self['val'] = 42 ... def __getitem__(self, item): ... # this doesn't get called from the eval statement ... print "*", item ... return dict.__getitem__(self, item) ... >>> a = Foo() >>> >>> print a['val'] * val 42 >>> print eval('val*2+6', a) * val 90 Kent -- http://mail.python.org/mailman/listinfo/python-list