У меня есть код на C, который я хочу представить в Python. У этого есть соглашение о вызовах как это:
int add(int a, int b, int *err)
где возвращаемое значение будет (a + b) или что-то еще, но если что-то пойдет не так, я получу код ошибки в * err. Я хочу обернуть эту функцию так, чтобы она работала так с точки зрения Python:
def add(a,b):
if something_bad:
raise RuntimeError("something bad")
return a+b
Это должно быть легко, верно? Но я не нахожу это так.
Вот кое-что, что у меня работает, но обратите внимание на myerr3
kludge:
%module myswig
%feature("autodoc","1");
%{
int add(int a, int b, int *err){
if(a < 0)*err = 1;
if(b < 0)*err = 2;
return a+b;
}
char *err_string(int err){
switch(err){
case 1:return "first argument was less than 0";
case 2:return "second argument was less than 0";
default:return "unknown error";
}
}
%}
%typemap(in,numinputs=0) int *err (int myerr = 0){
$1 = &myerr;
};
%exception{
$action
if(myerr3 != 0){
PyErr_SetString(PyExc_RuntimeError,err_string(myerr3));
return NULL;
}
};
int add(int a, int b, int *err);
Это ведет себя как следует, например, с
import myswig
print "add(1,1) = "
print myswig.add(1,1)
# prints '2'
print "add(1,-1) = "
print myswig.add(1,-1)
# raises an exception
# we never get here...
print "here we are"
но я не могу использовать это решение, потому что если у меня есть другая функция, такая как
int add(int a, int b, int c, int *err)
тогда мой myerr3
кладж сломается.
Как лучше решить эту проблему, не меняя соглашение о вызовах кода C?