2009-07-12 57 views
3

我正在使用Python C API從我的應用程序調用Python函數。我想介紹一個可以調用的函數列表,並希望能夠將這個列表限制爲只有那些具有期望數量的參數的列表。如何從C中查找Python函數的參數數量?

我很高興我可以走字典來提取函數列表,並使用PyCallable_Check來查明它們是否可以調用,但我不知道如何找出每個函數有多少個參數需要?

我發現了一種涉及Boost :: Python的技術,但寧願不加添加(爲什麼)(我希望!)將是一個小增加。

謝謝:)

回答

0

你的C代碼可以調用inspect.getargspec就像任何Python代碼會(例如,通過PyObject_CallMethod或其他等效的方式)並獲得關於每個功能或其他可關注的可調用的簽名的所有獨家新聞。

3

好的,所以最終我發現瞭如何去做。用戶定義的Python函數有一個名爲func_code的成員(在Python 3.0+中它是__code__),它本身有一個成員co_argcount,這大概是由Christophe給出的示例中Boost :: Python提取的。

我用這樣的容貌(它主要基於如何走一個Python字典中的文檔,示例)代碼:

PyObject *key, *value; 
    int pos = 0; 
    while(PyDict_Next(pyDictionary, &pos, &key, &value)) { 
     if(PyCallable_Check(value)) { 
     PyObject* fc = PyObject_GetAttrString(value, "func_code"); 
     if(fc) { 
      PyObject* ac = PyObject_GetAttrString(fc, "co_argcount"); 
      if(ac) { 
       const int count = PyInt_AsLong(ac); 
       // we now have the argument count, do something with this function 
       Py_DECREF(ac); 
      } 
      Py_DECREF(fc); 
     } 
     } 
    } 

還是要謝謝你 - 那個線程確實導致我在正確的方向:)