(我正在重新提问使用一个例子,所以我想要的更清楚。)
说我有一个C ++函数:
void foobar(int arg0, int arg1);
我希望SWIG将其翻译成Python。但是,在Python中,我只想使用参数arg1
,并且计算arg0
是相同的。换句话说,我想让它成为Python
>>>foobar(x)
相当于C ++
foobar(x, x);
表示任何整数x。怎么样?
亚历克斯的答案指向了某个方向,但还远远不够。具体地%typemap(in, numinputs=0) int arg0 {
}
非常有用,因为它允许我传递1个参数,而Python不会抱怨。好。但是,剩下的部分是,如何在类型地图中从arg0
计算arg1
?
答案 0 :(得分:1)
您可以使用in
和argout
类型地图类型。它们的主要目的是允许在其他参数中返回多个值。但副作用是你用目标语言隐藏这些参数:
%typemap(in, numinputs=0, noblock=1) type1 *arg1 {
type1 arg1;
$1 = &arg1;
}
%typemap(argout) type1 *arg1 {
// now *$1 has the value of Py_calculate_value_of_arg1()
// you can do additional checks here
}
returnType foobar(type0 arg0, type1 *arg1) {
*arg1 = Py_calculate_value_of_arg1();
}
python代码将是
foobar(arg0_value)
答案 1 :(得分:1)
使用multi-argument typemap。请注意,typemap将匹配其参数列表中具有参数集的任何函数。这通常用于将Python字符串映射到C中的一对参数,例如char*, size_t
,但只要将单个Python参数映射到多个参数,就可以使用它:
%module x
// for a single input parameter in Python, if a function takes two integers
// named explicitly "int arg0, int arg1", map the two parameters to that
// same input.
%typemap(in) (int arg0, int arg1) %{
$1 = PyInt_AsLong($input);
$2 = $1;
%}
%inline %{
#include <stdio.h>
void foo(int arg0, int arg1)
{
printf("%d %d\n",arg0,arg1);
}
void bar(int arg0, int arg1, int other)
{
printf("%d %d %d\n",arg0,arg1,other);
}
void baz(int other, int arg0, int arg1)
{
printf("%d %d %d\n",other,arg0,arg1);
}
%}
输出:
>>> import x
>>> x.foo(5)
5 5
>>> x.bar(1,5)
1 1 5
>>> x.baz(5,1)
5 1 1