2011-12-07 6 views
0

属性名 が存在しない場合は、それ自身(名前文字列)を返すようにグローバルをオーバーライドしようとしています。 これはevalでC initilizerのリストを素早く/ハッキリに解析するために使用します。 マイコード:__getattr__の問題を伴うevalグローバルのオーバーライド

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


eval_globals = EvalGlobalsDict(globals()) 

私は実在しない名前をevalにしようとするたびに、それは私にNameError

eval("aaa",eval_globals) 

を与え、私が直接

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

を呼び出そうと私は戻って取得有効なattributtesの場合でもattr名の文字列。 私は何が間違っていますか?

+2

答えは正しいのですが、通常の属性検索が失敗した場合は、 'if' /' else'は必要ありませんので、FYI '__getattr__'は、呼び出されますちょうど 'return name'がそれを行います(実際にあなたが変更したい属性アクセスの場合)。 – agf

答えて

4

dictをサブクラス化しているので、__getitem__(インデックスアクセサ)をオーバーライドする必要があります。 AKXによって与えられた

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 
関連する問題