我正在使用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
答案 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中。