LINUX.ORG.RU

[SWIG][C++][Python] как автоматом преобразовать некоторые типы возвращаемых значений на уровне питоновской обертки?

 , ,


0

1

Есть некий C++ модуль проимпортированный через SWIG в Python. Необходимо автоматом преобразовать все возвращаемые значения (т.е. результаты вызова методов и ф-й и результаты обращения к полям классов) некоторого пользовательского типа (шаблонного, но не проинстацированного) к другому типу, но сделать это в питоновской обертке а не в _wrap.cxx файле (там просто ф-ии преобразования не видны, ф-ии преобразования проинстацированы в другом модуле и грузятся в питоновскую обертку через import...).

Ничего лучше чем переписать __getattrtibute__ у класса в голову не приходит, но это фиговое решение, и потом непонятно что с обычными ф-ми делать... Хочется аналог typemap, но что бы он добавлял код в питон а не во _wrap.cxx Кто то что то может посоветовать?

Да, можно конечно через typemap воткнуть код импортирующий через PY API нужный модуль, достающий и вызывающий оттуда нужную ф-ю преобразования, но уж больно это извращенно выглядит... ;-(((

★★★★★

Последнее исправление: AIv (всего исправлений: 1)

Если используемая версия Питона поддерживает декораторы на классах, напиши декоратор. Иначе - наверное, можно через метакласс.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Во, спасибо, это здравая мысль... про наследование я и забыл;-(((

Но я понял что надо на самом деле больше. ПРоблема такая - есть библиотека с шаблонными классами, для нее есть питоновские модули где эти классы правльным образом проинстанцированны. Есть пользователский модуль, юзающий эту библиотеку. Хочется, что бы шаблонные классы из пользовательского модуля у в этом модуле не инстанцировались а брались из библиотечных модулей.

1) Инстанцированные классы добавляют кучу кода во wrap.cxx и компилится это долго, задалбывает.

2) Сравнение типов (в питоне) не работает - один и тот же класс взятый из библиотеки и из пользовательского модуля с т.з. питона это разные классы и я его понимаю. Свиг то с этим как то разбирается...

Фигня в том, что в некоторых случаях из пользовательского модуля приходят объекты по ссылке, т.е. преобразование не поможет - нужно взять PySwigObject из пользовательского модуля и навернуть на него всю функциональность бибилиотечного. О как...

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

> Во, спасибо, это здравая мысль... про наследование я и забыл;-(((

Ненене, Дэвид Блейн, рро наследование я не говорил. Декоратор - это просто способ вызова генератора обертки, которая не обязана быть производным классом. Метакласс тоже не обязан генерить производные классы.

Кстати, декоратор на класс не является необходимымым;

class Wrappee: # whatever

Wrappee = gen_wrapper(Wrappee, куча_аргументов)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Вечер и я туплю. Для меня декоратор всегда был просто способом задать часть аргументов ф-ии, не? Хорошая вещь, но сюда я не понимаю как это прикрутить;-(((

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Как-то так


def p(*a): print a

class A(object):
        __slots__ = ("foo", "bar")

def gen_wrapper(cl):
        wcl = type("wrapped__" + cl.__name__, (cl,), {})
        for s in cl.__slots__:
                setattr(wcl, s, 
                        property(fget = lambda x: "read!!!1",
                                 fset = lambda x, val: p("write " + str(val))))
        return wcl

print A
A = gen_wrapper(A)
print A
a = A()
print a.foo
a.bar = 42

Я немного мошенничаю - __slots__ не везде есть, но, думаю, принцип понятен.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Понял, спасибо.

На самом деле вскрытие показало что оно само все работает. Я чего то в полном офигении нахожусь, совершенно непонятное дело..... свиг какой то очень умный. Такое ощущение, что у него единая таблица типов в рамках одного процесса. Есть небольшие грабли с аргументами шаблона по умолчанию (поэтому и казалось что не работает), но и это понятно - откуда ему бедолаге знать, что у шаблона два аргумента и второй скажем double, если он его вообще не обрабатывал.

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.