相关疑难解决方法(0)

Python C扩展 - 为什么使用关键字参数的方法强制转换为PyCFunction

我正在学习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?如果没有,是否有时间我应该/必须使用它?

python python-c-extension

7
推荐指数
1
解决办法
1934
查看次数

PyArg_ParseTupleAndKeywords 抛出警告:ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]

搜索有关如何使用PyArg_ParseTupleAndKeywords我发现这些问题的示例:

  1. 如何使用 PyArg_ParseTupleAndKeywords 解析带有可选参数和关键字的元组?
  2. 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, &regex ) ) {
        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)

c c++ python python-c-api c++11

1
推荐指数
1
解决办法
403
查看次数

标签 统计

python ×2

c ×1

c++ ×1

c++11 ×1

python-c-api ×1

python-c-extension ×1