使用 __getattr__ 问题覆盖 eval 全局变量

发布于 2024-12-20 03:24:42 字数 659 浏览 1 评论 0原文

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

I'm trying to override globals so that any attribute name
that doesn't exists returns itself(the name string).
The reason for this is to use it in eval to do some quick/hacky parsing of a c initilizer list, (and just because of course).
My Code:

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


eval_globals = EvalGlobalsDict(globals())

Whenever I try to eval a non existent name it gives me a NameError

eval("aaa",eval_globals)

And if I try to directly call

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

I only get back the attr name string even for valid attributtes.
What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小…楫夜泊 2024-12-27 03:24:42

由于您要对字典进行子类化,因此您需要重写 __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

Since you're subclassing a dict, you'll want to override __getitem__ (the indexing accessor).

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

prints

> 'aaa'
> 1337
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文