словарь подклассов Python для пользовательского пространства имен в методе exec ()
Я пытаюсь создать подкласс словаря для использования в методе exec. В конечном счете, я хотел бы, чтобы локальная функция имела собственное поведение для определения имен.
В приведенном ниже коде функцияb()
на самом деле имеет правильныйglobals()
доступный для него словарь, однако он не может найти его при разрешенииz
.
Работает лиb()
сначала не искатьlocals()
затемglobals()
?
Очень загадочно. Любая помощь приветствуется.
t = '''
def b():
# return (globals()['z']) #works
return z #fails
b()
'''
class MyDict(dict):
def __init__(self, g):
dict.__init__(self)
self.my_g = g
def __getitem__(self, key):
print("GET ", key)
try:
val = dict.__getitem__(self, key)
except:
print("GET exception1")
val = self.my_g[key]
return val
g = {'z':123}
md = MyDict(g)
#fails to find z
exec(t, md, md)
#works
#exec(t, g, g)
output
GET b
Traceback (most recent call last):
File "/project1/text12", line 31, in <module>
File "<string>", line 6, in <module>
File "<string>", line 4, in b
NameError: global name 'z' is not defined