PyArg_ParseTupleAndKeywords期望一个空参数,而指定的是一个对象?

3

我在C Python扩展中有以下对PyArg_ParseTupleAndKeywords的调用:

static char *kwlist [] = {
    "page_slug", "keys", "facets", "categories", "max_level",
    "current_level", "level", "parent_slug", "query",
    "include_category", "include_ancestor", NULL
};

int max_level, current_level, level = 0;
PyObject *page_slug, *keys, *facets, *categories,
         *parent_slug = PyString_FromString(""), *query = Py_None,
         *include_category = Py_True, *include_ancestor = Py_True;

if (!PyArg_ParseTupleAndKeywords(
        args, kwargs, "OO!O!O!ii|iOOO!O!", kwlist,
        &page_slug, &PyList_Type, &keys,
        &PyDict_Type, &facets, &PyDict_Type, &categories, 
        &max_level, &current_level, &level, &parent_slug,
        &PyBool_Type, &include_category, 
        &PyBool_Type, &include_ancestor)) {
    return NULL;
}

这将会生成类似于下面的签名:

func(page_slug, keys, facets, categories, max_level,
     current_level, level=0, parent_slug="", query=None,
     include_category=True, include_ancestor=True)

然而,当该方法从Python内部调用时,会引发如下的TypeError

TypeError: argument 10 must be (null), not bool

请问为什么参数10应该接受PyObject*,但期望为NULL?还有,如何进行修正?

编辑:

从Python中调用该函数的方式是:

func(page_slug, keys, facets, categories, max_level,
     current_level, level=level + 1, parent_slug=slug,
     query=query, include_category=include_category,
     include_ancestor=include_ancestor)

page_slugparent_slugquery为unicode对象,keys为列表,max_levelcurrent_levellevel为整数,facetscategories为字典。

不包括布尔参数(include_ancestorinclude_category)可以正常工作(或者说调用PyArg_ParseTupleAndKeywords可以正常工作,但目前在C函数中会发生分段错误),但其中任何一个参数都会导致引发TypeError

PyArg_ParseTupleAndKeyword的调用更改为:

PyArg_ParseTupleAndKeywords(
        args, kwargs, "OO!O!O!ii|iOOOO", kwlist,
        &page_slug, &PyList_Type, &keys,
        &PyDict_Type, &facets, &PyDict_Type, &categories, 
        &max_level, &current_level, &level, &parent_slug,
        &include_category, &include_ancestor)

(即删除对include_categoryinclude_ancestor的布尔要求)会导致在PyArg_ParseTupleAndKeywords中发生分段错误。)

你能展示一下如何从Python侧调用该函数吗?指定和不指定参数时都会触发错误吗? - Bakuriu
1个回答

2

&parent_slug,之后,您没有传递queryPyArg_ParseTupleAndKeywords

正确的调用应该是:

if (!PyArg_ParseTupleAndKeywords(
        args, kwargs, "OO!O!O!ii|iOOO!O!", kwlist,
        &page_slug, &PyList_Type, &keys,
        &PyDict_Type, &facets, &PyDict_Type, &categories, 
        &max_level, &current_level, &level, &parent_slug,
        &query, &PyBool_Type, &include_category, 
        &PyBool_Type, &include_ancestor)) {
    return NULL;
}

您的原始调用导致格式和对象列表不匹配,从而引发异常(我认为是这样)。

拆分格式以及正在传递的内容

O   &page_slug
O!  &PyList_Type, &keys
O!  &PyDict_Type, &facets
O!  &PyDict_Type, &categories
i   &max_level
i|  &current_level
i   &level
O   &parent_slug
O   ---
O!  &PyBool_Type, &include_category
O!  &PyBool_Type, &include_ancestor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接