Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyArg_ParseTupleAndKeywords在指定对象时需要空参数?_Python_Python C Api_Cpython - Fatal编程技术网

Python PyArg_ParseTupleAndKeywords在指定对象时需要空参数?

Python PyArg_ParseTupleAndKeywords在指定对象时需要空参数?,python,python-c-api,cpython,Python,Python C Api,Cpython,我在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

我在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)
页面段塞
父段塞
查询
是unicode对象时,
是一个列表,
最大级别
当前级别
级别
是整数,
类别
是dict

不包括布尔参数(
include_祖先
include_类别
)是有效的(或者更确切地说,调用
PyArg\u 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_category
include_祖先
)的布尔要求会导致
PyArg_ParseTupleAndKeywords
中出现分段错误,您没有在
和parent_slug之后将
查询传递给
PyArg_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

您可以演示如何从python端调用函数吗?指定和不指定参数时是否都会引发错误?