2016-01-28 119 views
1

我已經看遍了,但我找不到PyArg_ParseTupleAndKeywords()與包含可選參數— 關鍵字的元組—一起使用的示例。我發現的最接近的是this question,但答案並不特別有用。大多數例子似乎都有關鍵字作爲可選參數,但它看起來像元組也應該能夠包含可選參數。如何使用PyArg_ParseTupleAndKeywords來解析一個包含可選參數以及關鍵字的元組?

想我試圖解析以下參數:

  • 雙打(強制)
  • 雙打(可選,無關鍵字)
  • 可選關鍵字參數的numpy的數組的數組numpy的:
    • K1 =>雙打的numpy的陣列
    • K2 =>整數
    • K3 =>雙
    • K4 => Python類實例

好像我應該做這樣的事情

static PyObject* pymod_func(PyObject* self, PyObject* args, PyObject* kwargs) { 
    static char* keywords[] = {"k1", "k2", "k3", "k4", NULL}; 

    PyObject *arg1, *arg2, *k1, *k4 
    PyObject *arr1, *arr2, *karr1; 
    double *k3; 
    int *k2; 
    PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O!OidO", keywords, &arg1, &PyArray_Type, &arg2, &PyArray_Type, &k1, &PyArray_Type, &k2, &k3, &k4); 

    arr1 = PyArray_FROM_OTF(arg1, NPY_FLOAT64, NPY_ARRAY_INOUT_ARRAY); 
    if (arr1 == NULL) return NULL; 

    arr2 = PyArray_FROM_OTF(arg1, NPY_FLOAT64, NPY_ARRAY_INOUT_ARRAY); 
    // no null check, because optional 

    karr1 = PyArray_FROM_OTF(k1, NPY_FLOAT64, NPY_ARRAY_INOUT_ARRAY); 
    // again, no null check, because this is optional 

    // do things with k3, k2, and k4 also 

    return NULL; 
} 

其它地方我已經看了,但沒有找到多少求助:

什麼是使用PyArg_ParseTupleAndKeywords()適當的方式嗎?

回答

0

我認爲類似於下面的簡化解決方案的東西應該適用於您的方案,但如果您有許多可選參數或更多有趣的參數類型,它可能會變得討厭。 我不確定是否有更好的解決方案,但我一直無法找到。希望有一天有人會發佈一個更清潔的解決方案。

您必須聰明才能在更復雜的解析場景中生成有用的arg解析錯誤消息 。

static PyObject* nasty_func(PyObject* self, PyObject* args, PyObject* kwargs) { 
    static char* keywords[] = {"one", "optional", "two", NULL}; 
    static char* keywords_alt[] = {"one", "two", NULL}; 

    int ok = 0; 
    PyObject *result = NULL; 

    int *one; 
    char *two; 
    int *optional; 

    ok = PyArg_ParseTupleAndKeywords(args, kwargs, "iis", keywords, &one, &optional, &two); 

    if (!ok) { 
    PyErr_Clear(); 
    ok = PyArg_ParseTupleAndKeywords(args, kwargs, "is", keywords_alt, &one, &two); 
    if (!ok) { 
     PyErr_SetString(PyExc_TypeError, "Invalid args. allowed formats: 'one:i, two:s' or 'one:i, optional:i, two:s'"); 
     return NULL; 
    } 
    } 

    // do stuff with your parsed variables 

    return result; 
} 
相關問題