swig C ++ - > Python 2.X转换和方法的参数

时间:2016-06-02 16:40:19

标签: python c++ swig

我正在使用Eric IDE for Python。它使用自动完成,它应该非常有用。 但是,我们开发python脚本,使用我们使用Swig转换的C ++库中的对象。不幸的是,swig创建一个.py文件,该文件映射每个C ++对象的方法,用*args唯一参数替换所有参数,因此Eric的自动完成没有它可能的那么有用,因为它没有显示参数列表,但只显示那些没用的参数。

例如,我有一个C ++ .h文件:

 #ifdef SWIG
 %module testPy
 %{
    #include "testPy.h"
 %}
 %feature("autodoc","0");
 #endif //SWIG
 class IntRange
 {
   public:
     bool contains(int value) const;
 };

我通过以下方式生成.py文件:

 swig3.0 -c++ -python testPy.h

,生成的.py文件包含:

  def contains(self, *args):
    """contains(self, value) -> bool"""
    return _testPy.IntRange_contains(self, *args)

所以autodoc部分很好。不幸的是,它没有被Eric使用,并且该方法的参数已被* args替换。

有没有办法让swig保持参数'名字?

N.B:我使用的是Python 2.7和swig 3.0.2

2 个答案:

答案 0 :(得分:1)

根据Swig Changelog,Python命名参数可从3.0.3版获得。

可能使自动完成更加智能化的一件事是生成文档字符串。我不熟悉Eric所以我不知道它是否在自动完成中使用它们,但是如果该信息在方法的doc字符串中,则某些编辑会显示原始类型信息。您可以通过设置autodoc功能启用此功能:

%feature("autodoc", "0");

该数字最多可达3,并确定文档字符串的详细/信息量。例如,对于第三级,使用以下C ++方法:

class IntRange
{
public:
  bool contains(int value) const;
};

产生以下Python代码:

def contains(self, value):
    """
    contains(IntRange self, int value) -> bool

    Parameters
    ----------
    value: int

    """
    return _foo.IntRange_contains(self, value)

答案 1 :(得分:0)

我刚试过你的例子(只有这一个函数),对我来说,SWIG确实保留了参数名称(SWIG 3.0.9)。

但是,如果您的函数是一个重载函数,那么SWIG将始终创建一个包含*args的包装器,并在C ++中执行调度。

使用" autodoc"在这种情况下,feature非常有用,因为方法签名(带有参数名称)被放入docstring中。