словарь подклассов 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

Ответы на вопрос(1)

Ваш ответ на вопрос