0

我正在尝试覆盖全局变量,以便任何不存在的属性名称都返回自身(名称字符串)。这样做的原因是在 eval 中使用它来对 ac initilizer 列表进行一些快速/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 名称字符串。我究竟做错了什么?

4

1 回答 1

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
于 2011-12-07T11:52:46.113 回答