0

存在しない属性名がそれ自体(名前文字列)を返すように、グローバルをオーバーライドしようとしています。この理由は、evalでそれを使用して、acイニシライザーリストのいくつかの迅速でハッキーな解析を行うためです(そしてもちろん)。私のコード:

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)

有効な属性であっても、属性名の文字列のみが返されます。私は何が間違っているのですか?

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 に答える