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名の文字列。 私は何が間違っていますか?
答えは正しいのですが、通常の属性検索が失敗した場合は、 'if' /' else'は必要ありませんので、FYI '__getattr__'は、呼び出されますちょうど 'return name'がそれを行います(実際にあなたが変更したい属性アクセスの場合)。 – agf