Всякий раз, когда вы видите эту ошибку, перейдите в папку «Конфигурация» и проверьте, что только что был создан файл журнала. Он должен иметь правильную Exptecttrace. Мой был случай, когда я получил обновленную 32-битную JRE (или JVM), которая была стандартной Java, добавленной в Path. И моя установка Eclipse была 64-битной, что означало, что ей нужна 64-разрядная виртуальная машина для запуска своих собственных SWT-библиотек. Поэтому я просто удалил 32-битную JVM и заменил ее на 64-разрядную JVM.
Интересно, улучшит ли этот механизм отчетности, вместо того, чтобы молча генерировать файл журнала в каком-то каталоге.
Похоже, проблема заключалась в том, что первый вызов PyArg_ParseTupleAndKeywords()
установил индикатор ошибки, который вызвал сбой второго вызова функции. Поэтому решение состоит в том, чтобы вставить вызов на PyErr_Clear()
между вызовами на PyArg_ParseTupleAndKeywords()
. Таким образом, следующий код выполняет задачу
static PyObject* my_func(PyObject *self, PyObject *args, PyObject *kwargs) {
double a; // first argument, required
double b=0, c=0; // second argument, required but mutually exclusive, b is default keyword if no keyword is set
char d[] = "..."; // third argument, optional
// parse arguments
static const char *kwList1[] = {"a","b","c","d"};
static const char *kwList2[] = {"a","b","d"};
int ret;
if (!(ret = PyArg_ParseTupleAndKeywords(args,kwargs,"d|dds",(char **)kwList1,&a,&b,&c,&d))) {
PyErr_Clear();
ret = PyArg_ParseTupleAndKeywords(args,kwargs,"d|ds",(char **)kwList2,&a,&b,&d));
}
if (!ret) return NULL;
// verify that one of, but not both, variables b and c are non-zero
if (b==0 && c==0) {
PyErr_SetString(PyExc_TypeError,"Required mutually exclusive arguments 'b' or 'c' (pos 2) not found (or input with value 0)");
return NULL;
} else if (b!=0 && c!=0) {
PyErr_SetString(PyExc_TypeError,"Use of multiple mutually exclusive required arguments 'b' and 'c' (pos 2)");
return NULL;
}
...
}
. Опять же, это не защищает от вызова функции с обоими аргументами b
и c
, учитывая, что один из них равен 0, а другой не. Однако это небольшая проблема.