Найдите примеры использования PyArg_ParseTupleAndKeywords
I нашел такие вопросы:
- Как можно использовать PyArg_ParseTupleAndKeywords для анализировать кортеж с необязательными аргументами, а также с ключевыми словами?
- Как работает PyArg_ParseTupleAndKeywords?
Они оба используют такие вещи, как static char* kwlist[] = {"a", "b", NULL}
static int PyClass_init(PyClass* self, PyObject* args, PyObject* kwargs) {
char* path;
char* regex;
static char* kwlist[] = {"", "", NULL};
if( !PyArg_ParseTupleAndKeywords( args, kwargs, "s|s", kwlist, &path, ®ex ) ) {
return -1;
}
// other code ...
return 0;
}
Компиляция этого с language = "c++"
на setup.py
и сборка с -std=c++11
выдает это предупреждение:
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O0 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Isource -I/usr/include/python3.6m -c source/test.cpp -o build/temp.linux-x86_64-3.6/source/test.o -O0 -g -ggdb -std=c++11 -fstack-protector-all
source/test.cpp: In function ‘int PyClass_init(PyClass*, PyObject*, PyObject*)’:
source/test.cpp:41:42: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
static char* kwlist[] = {"a", "b", NULL};
^
В поисках этой ошибки я нашел этот вопрос Почему преобразование из строковой константы в 'char*' допустимо в C, но недопустимо в C++ требует исправления, но применение исправления, поскольку static char* const kwlist[] = {"a", "b", NULL};
сохраняет/обновляет предупреждение, представляющее ошибку:
source/test.cpp:41:50: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
static char* const kwlist[] = {"a", "b", NULL};
^
source/test.cpp:41:50: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
source/test.cpp:43:89: error: invalid conversion from ‘char* const*’ to ‘char**’ [-fpermissive]
if( !PyArg_ParseTupleAndKeywords( args, kwargs, "s|s", kwlist, &path, ®ex ) ) {
^
In file included from /usr/include/python3.6m/Python.h:117:0,
from source/test.cpp:3:
/usr/include/python3.6m/modsupport.h:17:41: note: initializing argument 4 of ‘int _PyArg_ParseTupleAndKeywords_SizeT(PyObject*, PyObject*, const char*, char**, ...)’
#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT
^
/usr/include/python3.6m/modsupport.h:17:41: note: in definition of macro ‘PyArg_ParseTupleAndKeywords’
#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
Как я могу избавиться от предупреждения, используя конструкцию, эквивалентную static char* kwlist[] = {"a", "b", NULL}
с C++ 11
, при этом будучи совместимым с требованиями Python C API?
Обновлять
После предложенного я попробовал static const char* kwlist[] = {"a", "b", NULL}
, но PyArg_ParseTupleAndKeywords
не принимает его:
source/test.cpp:43:89: error: invalid conversion from ‘const char**’ to ‘char**’ [-fpermissive]
if( !PyArg_ParseTupleAndKeywords( args, kwargs, "s|s", kwlist, &filepath, &rawregex ) ) {
^
In file included from /usr/include/python3.6m/Python.h:117:0,
from source/test.cpp:3:
/usr/include/python3.6m/modsupport.h:17:41: note: initializing argument 4 of ‘int _PyArg_ParseTupleAndKeywords_SizeT(PyObject*, PyObject*, const char*, char**, ...)’
#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT
^
/usr/include/python3.6m/modsupport.h:17:41: note: in definition of macro ‘PyArg_ParseTupleAndKeywords’
#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
static const char* kwlist[] = {"", "", NULL};
? - person Jean-François Fabre   schedule 10.06.2019error: invalid conversion from ‘const char**’ to ‘char**’
, потому чтоPyArg_ParseTupleAndKeywords
требуетchar **
- person user   schedule 10.06.2019