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

swig C++->Python 2.X conversion and method's arguments

我正在为 Python 使用埃里克 IDE。它正在使用自动完成功能,应该非常有用。 但是,我们开发了 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

根据 Swig Changelog,Python 命名参数从版本 3.0.3 开始可用。

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

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

这个数字最多可以达到 3,它决定了文档字符串的 verbose/informative。例如,对于第三级,以下 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)

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

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

在这种情况下使用 "autodoc" 功能确实非常有用,因为方法签名(带有参数名称)已放入文档字符串中。