gpt4 book ai didi

python - 如何在调用 PyArg_ParseTupleAndKeywords 时仅解析 'kwargs' 并跳过 args?

转载 作者:行者123 更新时间:2023-11-28 17:38:47 29 4
gpt4 key购买 nike

我正在调用一个函数,它接受一个位置参数列表,后跟关键字参数。我想分别处理 args 和 kwargs。不幸的是,与位置参数的 PyArg_ParseTuple 不同,关键字参数没有等效的 PyArg_ParseKeywords。我试图通过传递 Py_None(也是 NULL)代替 args 来阻止位置参数的解析:

static PyObject* test_func(PyObject* self, PyObject* args, PyObject *kwargs)
{
static const char *kwList[] = {"kw1", "kw2", NULL};
const char* kw1_val = NULL;
PyObject* kw2_val = NULL;

if (! PyArg_ParseTupleAndKeywords(Py_None,
kwargs,
"zO",
const_cast<char**>(kwList),
&kw1_val,
&kw2_val))
{
return NULL;
}
}

那里有 Py_None(或 NULL)会导致:

Python/getargs.c:1390: bad argument to internal function

如果我用 args 替换 Py_None,我会收到以下错误:

TypeError: function takes at most 2 arguments (4 given)

上面的 TypeError 发生是因为它解压缩了我传递给 test_func 的 2 个位置参数和 2 个关键字参数,而在解析方法中只有两个变量 kw1_val 和 kw2_val 接收这 4 个值。

有没有办法处理上述情况?请注意,位置参数可以有任意数量的值。

最佳答案

尝试传递一个空元组而不是 Py_None:

static PyObject* test_func(PyObject* self, PyObject* args, PyObject *kwargs)
{
static const char *kwList[] = {"kw1", "kw2", NULL};
const char* kw1_val = NULL;
PyObject* kw2_val = NULL;

PyObject *retvalue = NULL;
PyObject *empty = PyTuple_New(0);

if (empty == NULL){
goto out;
}

if (! PyArg_ParseTupleAndKeywords(empty,
kwargs,
"zO",
const_cast<char**>(kwList),
&kw1_val,
&kw2_val))
{
goto out;
}

// other code here

out:
Py_XDECREF(empty);
return retvalue;
}

关于python - 如何在调用 PyArg_ParseTupleAndKeywords 时仅解析 'kwargs' 并跳过 args?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27485439/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com