Переопределение eval globals с проблемами __getattr__ - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь переопределить глобальные переменные, чтобы любое имя атрибута то, что не существует, возвращает себя (строка имени). Причина этого в том, чтобы использовать его в eval для быстрого / хакерского анализа списка инициализаторов c (и просто потому, что он есть). Мой код:

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 даже для действительных атрибутов. Что я делаю не так?

1 Ответ

4 голосов
/ 07 декабря 2011

Поскольку вы подклассифицируете 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))

print

> 'aaa'
> 1337
...