Почему swig неправильно обрабатывает AttributeError при использовании __getattribute__? - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть класс, который экспортируется из C ++ в Python в SWIG. Все отлично работает Теперь я хочу определить getattribute для обработки виртуализированного доступа к переменным и функциям, которые определены на языке сценариев, встроенном в код C ++. Однако когда я определяю функцию getattribute с использованием% pythoncode, она не работает должным образом. Если я не могу найти переменные или функции, я должен вызвать и исключение под названием AttributeError. Однако функция SWIG getattr подавляется этим.

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

%}

Теперь, если я сделаю это, все в порядке:

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

Итак, поведение генерируемого SWIG getattr не работает должным образом, когда я вызываю AttributeError, как я должен делать, когда атрибут и не найден. Поэтому для своих целей я буду использовать второй пример и вставлять свой собственный код перед процедурой, чтобы определить, существует ли виртуализированная функция. Если нет, я позволю функции 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, исключение работает. Так что поведение глотка не правильное.

1 Ответ

0 голосов
/ 29 декабря 2011

Теперь, я думаю, я понял это:

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, кажется, обрабатывает исключение правильно.Так что только мой код не работал.

...