Message163095
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
>>> |
|
Date |
User |
Action |
Args |
2012-06-18 10:59:59 | johnf | set | recipients:
+ johnf |
2012-06-18 10:59:59 | johnf | set | messageid: <1340017199.64.0.733628658868.issue15099@psf.upfronthosting.co.za> |
2012-06-18 10:59:58 | johnf | link | issue15099 messages |
2012-06-18 10:59:57 | johnf | create | |
|