Swig игнорировать унаследованную функцию - PullRequest
0 голосов
/ 31 января 2019

Я использую swig для генерации привязок Python к YaST .Я добавляю функции в родительский класс с именем YCPValue через% extends.Swig также добавляет эти функции родительского класса в дочерние классы (например, YCPCode).Я не хочу, чтобы эти родительские функции класса были в потомке, поэтому я использую% ignore, чтобы игнорировать каждую функцию.Кроме swig все еще включает функции, которые я% игнорирую.Это из-за% расширения родительского класса?Кто-нибудь знает, есть ли способ исключить эти функции из дочернего процесса?

%include <ycp/YCPValue.h>
%extend YCPValue {
    bool isCode() {
        return (*($self))->isCode();
    }
    YCPCode asCode() {
        return (*($self))->asCode();
    }
}

%include <ycp/YCPCode.h>
%ignore YCPCode::isCode();
%ignore YCPCode::asCode();

Идея здесь в том, что мне может быть возвращен тип YCPValue, и тогда мне придется использовать функцию isCode () дляпосмотрите, что это такое, и asCode (), чтобы вернуть тип в виде объекта YCPCode.Но если мне возвращают объект YCPCode, то я не хочу иметь эти дополнительные функции (потому что это портит pydocs и т. Д.).Здесь также задействованы дополнительные дочерние классы, это только один пример.

1 Ответ

0 голосов
/ 15 февраля 2019

Что вы можете сделать, это следующее

%extend SomeChild {
// Your C++ extenstion...
bool isCode() {
    return (*($self))->isCode();
}
// Next your python extension
%pythoncode %{
if _newclass:
  __swig_dir__ = __swig_getmethods__.copy()
  __swig_dir__.update(__swig_setmethods__)
  __swig_dir__ = list(__swig_dir__.keys())
  __swig_dir__.remove('asCode')
def __dir__(self):
  return SomeChild.__swig_dir__
%}
};

Это не самое элегантное решение, но я использовал эти перегрузки ранее для фильтрации функций, которые не предназначены для вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...