How to parse only 'kwargs' and skip args when calling PyArg_ParseTupleAndKeywords?
我正在调用一个函数,该函数接受位置参数列表和关键字参数。我想分别处理args和kwargs。不幸的是,与位置参数的pyarg-parsetuple不同,关键字参数没有等效的pyarg-parsekeywords。我试图通过传递py-none(也为空)来代替args来防止解析位置参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } } |
如果不存在(或为空),则会导致:
1 | Python/getargs.c:1390: bad argument to internal function |
如果我用args替换py-none,我会得到以下错误:
1 | TypeError: function takes at most 2 arguments (4 given) |
上面的typeerror发生在它解包2个位置参数和2个我传递给test_func的关键字参数时,而解析方法中只有两个变量kw1_val和kw2_val来接收这4个值。
有没有办法处理上述情况?注意,位置参数可以有任意数量的值。
尝试传递一个空元组而不是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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; } |