New submission from John Firestone <jo...@freenet.de>: exec(source, Dict()) doesn't call Dict().__getitem__ or Dict().__missing__ if the source string contains a function and the function references an undefined global.
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 print ' 3' 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) Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:32:06) [GCC 4.0.1 (Apple Inc. build 5493)] on darwin >>> import curiosity Dict1.__getitem__ 1 __getitem__ 's' __getitem__ 'f' 2 NameError: global name 's' is not defined Dict2.__missing__ 1 __missing__ 's' 2 NameError: global name 's' is not defined >>> ---------- components: Interpreter Core files: curiosity.py messages: 163095 nosy: johnf priority: normal severity: normal status: open title: exec of function doesn't call __getitem__ or __missing__ on undefined global type: behavior versions: Python 2.7 Added file: http://bugs.python.org/file26041/curiosity.py _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue15099> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com