我在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, ¤t_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_slug
、parent_slug
和query
为unicode对象,keys
为列表,max_level
、current_level
和level
为整数,facets
和categories
为字典。
不包括布尔参数(include_ancestor
和include_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, ¤t_level, &level, &parent_slug,
&include_category, &include_ancestor)
(即删除对
include_category
和include_ancestor
的布尔要求)会导致在PyArg_ParseTupleAndKeywords
中发生分段错误。)