一千萬個為什麽

搜索

全局範圍的Python __setattr__和__getattr__?

假設我需要創建自己的小型DSL,它將使用Python來描述某種數據結構。例如。我希望能夠寫出類似的東西

f(x) = some_stuff(a,b,c)

並且使用Python,而不是抱怨未聲明的標識符或嘗試調用函數some_stuff,將其轉換為文字表達式以便我進一步方便。

通過使用正確重新定義的 __ getattr ____ setattr __ 方法創建一個類,可以得到一個合理的近似值,並按如下方式使用它:

e = Expression()
e.f[e.x] = e.some_stuff(e.a, e.b, e.c)

如果有可能擺脫惱人的“e”,那將會很酷。前綴甚至可能避免使用[]。所以我想知道,是否有可能暫時“重新定義”全局名稱查找和分配?在相關的說明中,也許有很好的軟件包可以輕松實現Python表達式的這種“引用”功能?

最佳答案

我不確定這是個好主意,但我想我會給它試一試。總結一下:

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

轉載註明原文: 全局範圍的Python __setattr__和__getattr__?