为什么swig在使用__getattribute__时没有正确处理AttributeError?

时间:2011-12-27 22:47:17

标签: c++ python swig getattribute

我有一个在SWIG中从C ++导出到Python的类。一切正常。现在我想定义 getattribute 来处理对C ++代码中内置的脚本语言定义的变量和函数的虚拟化访问。但是,当我使用%pythoncode定义 getattribute 函数时,它无法按预期工作。如果我找不到我应该引发的变量或函数,那么异常称为AttributeError。然而,SWIG函数 getattr 会对此产生影响。

%pythoncode %{
    def __getattribute__(self, attribute):
        raise AttributeError(attribute)

%}

现在如果我这样做就可以了:

%pythoncode %{
    def __getattribute__(self, attribute):
        return object.__getattribute__(self, attribute)
%}

因此,当我引发AttributeError时,SWIG生成的 getattr 的行为无法正常工作,就像我应该在找不到属性时那样。因此,出于我的目的,我将使用第二个示例并在例程之前插入我自己的代码,以确定是否存在虚拟化函数。如果不是,我将让默认对象getattribute函数处理它。

有没有更好的方法来解决这个问题?

现在我看到这个我发现它在常规Python 2.7中也不起作用:

class testmethods(object):
    def __init__(self):
        self.nofunc1 = None
        self.nofunc2 = "nofunc2"
    def func1(self):
        print "func1"
    def func2(self):
        print "func2"

    def __getattribute__(self, attribute):
        print "Attribute:",attribute
        raise AttributeError(attribute)

这会引发异常,但不会将责任转换为“ getattr ”功能。那么一个人应该如何应对呢?

好的,罢工。如果getattr存在于提升异常的对象中,则确实有效。因此,swig行为不正确。

1 个答案:

答案 0 :(得分:0)

现在,我想我想出了这个:

def __getattribute__(self, attribute): 
    try: 
        defattrib = object.__getattribute__(self, attribute) 
    except AttributeError,e: 
        defattrib = None 
    if defattrib is not None: 
        return defattrib             

    # find attributes in user defined functions 
            ... 


    # if an attribute cannot be found 
    raise AttributeError(attribute) 

这似乎工作正常。 swig getattr似乎正确处理异常。所以只是我的代码无效。