我正在学习Python-C扩展,并且很困惑为什么使用关键字参数的方法必须强制转换为PyCFunctions.
我对PyCFunction的理解是它需要两个指向PyObjects的指针并返回一个指向PyObject的指针 - 例如
PyObject* myFunc(PyObject* self, PyObject* args)
Run Code Online (Sandbox Code Playgroud)
如果我要使用一个使用关键字参数的函数,那么这个函数将使用三个指向PyObjects的指针并返回一个指向PyObject的指针 - 例如
PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs)
Run Code Online (Sandbox Code Playgroud)
但是,当我创建模块函数数组时(对于一个名为'adder'的函数):
{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" }
Run Code Online (Sandbox Code Playgroud)
工作良好.感觉就像我将一个浮点数转换为int并仍然使用浮点数的非整数部分.如果我没有看到这项工作,我会认为它不会起作用.我在这里不理解什么?
此外,我看到一些PyCFunctionWithKeywords的引用,它似乎有我认为我需要的函数签名,但我的编译器抱怨(发出警告)'不兼容的指针类型'.
是不是弃用了PyCFunctionWithKeywords?如果没有,是否有时间我应该/必须使用它?
搜索有关如何使用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;
}
Run Code Online (Sandbox Code Playgroud)
用language = "c++"on编译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 …Run Code Online (Sandbox Code Playgroud)