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.
In [1]: eval? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in function eval> Namespace: Python builtin Docstring: eval(source[, globals[, locals]]) -> value Evaluate the source in the context of globals and locals. The source may be a string representing a Python expression or a code object as returned by compile(). The globals must be a dictionary and locals can be any mappping, defaulting to the current globals and locals. If only globals is given, locals defaults to it. globals needs to be a real dictionary. The implementation uses the C API, it doesn't use the overridden __getitem__. The locals argument, apparently can be some other kind of mapping. -- Robert Kern [EMAIL PROTECTED] "In the fields of hell where the grass grows high Are the graves of dreams allowed to die." -- Richard Harter -- http://mail.python.org/mailman/listinfo/python-list