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" 功能确实非常有用,因为方法签名(带有参数名称)已放入文档字符串中。
我正在为 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" 功能确实非常有用,因为方法签名(带有参数名称)已放入文档字符串中。