2011-11-02 63 views
2

在嵌入式Python場景中,我們使用PyArg_ParseTupleAndKeywords從Python(版本> = 3.x)接收數據並將其用於C++應用程序。使用PyArg_ParseTupleAndKeywords時排除不相關的參數

目前,我們有一個類似的設置:

PyObject* whatever(PyObject *self, PyObject *args, PyObject *keywds) { 
    .... 
    static char* kwlist[] = { "foo", "bar", NULL }; 
    ... 
if(!PyArg_ParseTupleAndKeywords(args, keywds, ..., kwlist, ...)) 
    { 
     ...bail out 

然而,如果我們通過比兩個預期更多的參數(例如發出蟒蛇調用,比如whatever(foo="a", bar="b", baz="c"))整個事情崩潰(不是真的,它返回一個錯誤,但這超出了範圍)。

我們想避免這種情況;如果我們能解析只有kwlist中的參數並且忽略其他的everthing,那將是非常好的。什麼是最好的方式來做到這一點?

我們正在考慮的一種解決方案是將kwlist轉換爲dict,然後用PyDict_Merge等操作它。

回答

1

在我們解決了它象下面這樣結束:

(我回答我的問題,因爲沒有人回答,我想可能是在將來別人有價值)。

PyObject* whatever(PyObject *self, PyObject *args, PyObject *incoming_keywds) 
{ 

    static char* kwlist[] = { "foo", "bar", NULL }; 

    PyObject* keywds = PyDict_New(); 
    /** 
    * The following routine returns a subset of the incoming dictionary 'incoming_keywds' 
    * containing only the keys allowed in the list 'kwlist' 
    */ 
    for (int i = 0 ; kwlist[i] != NULL ; i++) 
    { 
     char* key = kwlist[i]; 
     PyObject *single_key = Py_BuildValue("s", key); 
     if (PyDict_Contains(incoming_keywds, single_key)) 
     { 
      // not checking for NULL as GetItem return value since 
      // we already checked above if the dict contains key 'single_key' 
      if (PyDict_SetItem(keywds, single_key, PyDict_GetItem(incoming_keywds, single_key)) < 0) 
      { 
       /* error */ 
      } 
     } 
     Py_DECREF(single_key); 
    } 
    /** end */