как разобрать требуемый взаимоисключающий аргумент в Python C-api

Всякий раз, когда вы видите эту ошибку, перейдите в папку «Конфигурация» и проверьте, что только что был создан файл журнала. Он должен иметь правильную Exptecttrace. Мой был случай, когда я получил обновленную 32-битную JRE (или JVM), которая была стандартной Java, добавленной в Path. И моя установка Eclipse была 64-битной, что означало, что ей нужна 64-разрядная виртуальная машина для запуска своих собственных SWT-библиотек. Поэтому я просто удалил 32-битную JVM и заменил ее на 64-разрядную JVM.

Интересно, улучшит ли этот механизм отчетности, вместо того, чтобы молча генерировать файл журнала в каком-то каталоге.

0
задан cpaitor 18 January 2019 в 10:29
поделиться

1 ответ

Похоже, проблема заключалась в том, что первый вызов 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, а другой не. Однако это небольшая проблема.

0
ответ дан cpaitor 18 January 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: