我正在尝试覆盖全局变量,以便任何属性名称 不存在的返回自身(名称字符串)。 这样做的原因是在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。 我做错了什么?
答案 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