如何在Python中覆盖内置的getattr?

时间:2010-06-16 16:21:53

标签: python

我知道如何覆盖对象的getattr()来处理对未定义对象函数的调用。但是,我想为内置getattr()函数实现相同的行为。例如,考虑这样的代码:

   call_some_undefined_function()

通常,这只会产生错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'call_some_undefined_function' is not defined

我想覆盖getattr(),以便拦截对“call_some_undefined_function()”的调用并找出要做的事情。

这可能吗?

2 个答案:

答案 0 :(得分:2)

我只能通过调用eval来想办法。

class Global(dict):
    def undefined(self, *args, **kargs):
        return u'ran undefined'

    def __getitem__(self, key):
        if dict.has_key(self, key):
            return dict.__getitem__(self, key)
        return self.undefined

src = """
def foo():
    return u'ran foo'

print foo()
print callme(1,2)
"""

code = compile(src, '<no file>', 'exec')

globals = Global()
eval(code, globals)

以上输出

ran foo
ran undefined

答案 1 :(得分:0)

你还没有说过你为什么要这样做。我有一个用例,我希望能够处理我在交互式Python会话期间创建的拼写错误,所以我把它放到我的python启动文件中:

import sys
import re

def nameErrorHandler(type, value, traceback):
    if not isinstance(value, NameError):
        # Let the normal error handler handle this:
        nameErrorHandler.originalExceptHookFunction(type, value, traceback)
    name = re.search(r"'(\S+)'", value.message).group(1)

    # At this point we know that there was an attempt to use name
    # which ended up not being defined anywhere.
    # Handle this however you want...

nameErrorHandler.originalExceptHookFunction = sys.excepthook
sys.excepthook = nameErrorHandler

希望这对将来想要为未定义的名称设置特殊错误处理程序的任何人都有帮助...这是否对OP有用是未知的,因为他们从未真正告诉我们他们的预期用例是什么