swig忽略继承的功能

问题描述 投票:1回答:1

我正在使用swig生成与YaST的python绑定。我通过%extend将函数添加到名为YCPValue的父类。 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等)。这里还涉及更多的子类,这只是一个例子。

python swig
1个回答
0
投票

你能做的是以下几点

%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__
%}
};

这不是最优雅的解决方案,但我之前使用过这些重载来过滤掉不打算调用的函数。

© www.soinside.com 2019 - 2024. All rights reserved.