用__getattr__问题覆盖eval全局变量

时间:2011-12-07 11:48:47

标签: python metaprogramming getattr

我正在尝试覆盖全局变量,以便任何属性名称 不存在的返回自身(名称字符串)。 这样做的原因是在eval中使用它来对c启动器列表进行快速/ hacky解析(当然也是因为)。 我的代码:

class EvalGlobalsDict(dict):
    def __getattr__(self, name):
        if hasattr(self, name):
            return super(EvalGlobalsDict, self).__getattr__(name) 
        else:
            return name


eval_globals = EvalGlobalsDict(globals())

每当我尝试评估一个不存在的名称时,它会给我一个NameError

eval("aaa",eval_globals)

如果我试着直接打电话

eval("globals().__getattr__("dir")",eval_globals)
eval("globals().__getattr__("dir")",eval_globals)

我只返回attr名称字符串,即使是有效的attributtes。 我做错了什么?

1 个答案:

答案 0 :(得分:4)

由于您正在为dict创建子类,因此您需要覆盖__getitem__(索引访问器)。

class EvalGlobalsDict(dict):
    def __getitem__(self, name):
        return self.get(name, name)

foo = 1337
eval_globals = EvalGlobalsDict(globals())
print repr(eval("aaa", eval_globals))
print repr(eval("foo", eval_globals))

打印

> 'aaa'
> 1337