Python __setattr__ 和 __getattr__ 用于全局范围?

KT.*_*KT. 6 python lookup redefine quoting variable-assignment

假设我需要创建自己的小型 DSL,它将使用 Python 来描述某种数据结构。例如,我希望能够写出类似的东西

f(x) = some_stuff(a,b,c)
Run Code Online (Sandbox Code Playgroud)

并且使用 Python,不要抱怨未声明的标识符或尝试调用函数 some_stuff,而是将其转换为文字表达式以方便我使用。

__getattr__通过创建一个具有正确重新定义和__setattr__方法的类并按如下方式使用它,可以获得对此的合理近似:

e = Expression()
e.f[e.x] = e.some_stuff(e.a, e.b, e.c)
Run Code Online (Sandbox Code Playgroud)

如果能够去掉烦人的“e”,那就太酷了。前缀,甚至可能避免使用 []。所以我想知道,是否有可能以某种方式暂时“重新定义”全局名称查找和分配?与此相关的是,也许有好的软件包可以轻松实现Python表达式的这种“引用”功能?

Ian*_*ing 3

我不确定这是一个好主意,但我想我应该尝试一下。总结一下:

class PermissiveDict(dict):
    default = None

    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            return self.default

def exec_with_default(code, default=None):
    ns = PermissiveDict()
    ns.default = default
    exec code in ns
    return ns
Run Code Online (Sandbox Code Playgroud)