0

SWIG で C++ から Python にエクスポートされるクラスがあります。すべて正常に動作します。次に、C++ コードに組み込まれたスクリプト言語で定義された変数と関数への仮想化アクセスを処理するgetattributeを定義したいと思います。ただし、 %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の動作が適切に機能しません。したがって、私の目的のために、2 番目の例を使用し、独自のコードをルーチンの前に挿入して、仮想化された関数が存在するかどうかを判断します。そうでない場合は、デフォルト オブジェクトの 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 の動作は正しくありません。

4

1 に答える 1

0

Now, I think I figured this out:

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) 

This seems to work fine. swig getattr seems to handle the exception properly. So it is just my code that was not working.

于 2011-12-29T19:02:09.183 に答える