为了账号安全,请及时绑定邮箱和手机立即绑定

求Python达人帮我解释一下,谢了

求Python达人帮我解释一下,谢了

慕虎7371278 2023-01-03 19:15:15

Python中的PyArg_ParseTupleAndKeywords函数如何使用,尤其他的format参数,求教,谢谢

查看完整描述

1 回答

?
慕沐林林

TA贡献1789条经验 获得超9个赞

当你的函数接受关键字参数,那么m_flags可设置为METH_VARARGS|METH_KEYWORDS,相应的使用PyArg_ParseTupleAndKeywords来进行参数解析。

函数 PyArg_ParseTupleAndKeywords() 声明如下:

int PyArg_ParseTupleAndKeywords(PyObject* arg, PyObject* kwdict, char* format, char* kwlist[],...);
参数arg和format定义同 PyArg_ParseTuple() 。参数 kwdict 是关键字字典,用于接受运行时传来的关键字参数。参数 kwlist 是一个NULL结尾的字符串,定义了可以接受的参数名,并从左到右与format中各个变量对应。如果执行成功 PyArg_ParseTupleAndKeywords() 会返回true,否则返回false并抛出异常。

注:嵌套的tuple在使用关键字参数时无法生效,不在kwlist中的关键字参数会导致 TypeError 异常

代码

#include <Python.h>

static PyObject* foo_bar3(PyObject* self, PyObject* args, PyObject* kw) {
static char* kwlist[] = {"i", "d", "s",NULL};
int iNum = 0;
double fNum = 2.0f;
char* str = "thing";
if (!PyArg_ParseTupleAndKeywords(args,kw,"i|ds",kwlist,&iNum,&fNum,&str)) {
printf("ERROR");
return NULL;
}
printf("num is: %d,%f,%s/n",iNum,fNum,str);
Py_RETURN_NONE;
}
static PyMethodDef foo_methods[] = {
{"bar3", (PyCFunction)foo_bar3, METH_VARARGS|METH_KEYWORDS, NULL},
{NULL,NULL,0,NULL}
};

PyMODINIT_FUNC initfoo() {
Py_InitModule3("foo", foo_methods, "My first extension module.");
}
相应的在函数表里记录如下:

{"foo_bar",(PyCFunction)foo_bar, METH_VARARGS|METH_KEYWORDS,NULL},
这样你在python代码中调用时可以传递关键字参数,其中只有i表示的整数是必需的,因此下述调用都是合法的:

import foo
foo.bar3(1)
foo.bar3(1,d=2.0)
foo.bar33(i=1,d=2.0)
而如果你传递了其他关键参数,则会报TypeError,比如foo.bar3(i=1,dd=3.0,s="fda")


查看完整回答
反对 回复 2023-01-06

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信