1 回答

TA貢獻2016條經驗 獲得超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")
添加回答
舉報