diccionario de Python subclasificado para espacio de nombres personalizado en el método exec ()

Estoy tratando de subclasificar un diccionario para usar en un método exec. En última instancia, me gustaría que la función local tuviera un comportamiento de alcance de nombre personalizado.

En el siguiente código, funciónb() de hecho tiene el correctoglobals() diccionario disponible para él, sin embargo, no puede buscarlo al resolverz.

Funcionab() primero no buscarlocals() entoncesglobals() ?

Muy desconcertante. Cualquier ayuda apreciada.

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)
salida
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

Respuestas a la pregunta(1)

Su respuesta a la pregunta