Couple of things: I don't think this is what you want:
def __getitem__(self, key): import __builtin__ if key == 'xx': return 'xx' I won't return a KeyError for any string you give g[] It will return 'xx' only if you supply key='xx' and ignore every other key=??? With the above code you can do g['yyy'] and you would get None For your example code to work, line 14 in your example needs to be: elif key in self.__dict__: # (change else to elif) for your dict (or globalscl) to act like other dicts() add an else: raise KeyError( 'Key not found: %s' % (key,)) __dict__ of a dict I believe is not the namespace of dict. I thought dict[key] and dict.__dict__[key] where not the same place __dict__ of dict in Python 2.5 and prior was rumored to be buggy and unused. Don't know about Python 2.6 + I thought __getitem__() did not look in __dict__ of dict(). If I copy your code into a module globalcl.py and comment out "print xx" in the string, and in PyCrust I "import globalcl" I too get the results and errors you claim. If I then do: >>>globalcl.g.keys() I get: ['__builtins__'] >>>globalcl.g['__builtins__'] I get: nothing (or None) >>>globalcl.g['__builtin__'] I get: nothing (or None) # ------------------------- # interesting part >>>globalcl.g['xx'] I get: 'xx' >>>if 'xx' in globalcl.g: ... print True ...else: ... print False I get: False # ------------------------- >>>globalcl.g.__builtins__ AttributeError: 'Global' object has no attribute __builtins__' >>>globalcl.g.__builtins__ AttributeError: 'Global' object has no attribute '__builtin__' >>>globalcl.g.__dict__ {'q': <function q at 0x01C738B0>} -- http://mail.python.org/mailman/listinfo/python-list