class Dict1(dict): def __getitem__(self, key): print ' __getitem__', repr(key) if key == 's': return None return dict.__getitem__(self, key) class Dict2(dict): def __missing__(self, key): print ' __missing__', repr(key) return None source = """if 1: print ' 1' s def f(): print ' 2' s f()""" print 'Dict1.__getitem__' try: exec(source, Dict1()) except NameError as exc_value: print ' %s: %s' % (exc_value.__class__.__name__, exc_value) print 'Dict2.__missing__' try: exec(source, Dict2()) except NameError as exc_value: print ' %s: %s' % (exc_value.__class__.__name__, exc_value)