2012-11-21 60 views
1

我們可以提取的PyObject使用找出一個方法的PyObject多少個參數需要

PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str()); 

我想知道的方法有多少參數需要指向一個python方法。所以如果功能是

def f(x,y): 
    return x+y 

我如何知道它需要2個參數?

+0

潛在的相關性:http://stackoverflow.com/questions/6616398/finding-python-function-parameters-from-c –

+1

此外,只注意到'.c_str()'在那裏 - 所以我猜你'使用C++。你看過Boost.Python或其他包裝庫嗎? - 使用本地Python C-API不是最愉快的體驗 –

回答

0

通過Jon提供的鏈接。假設你不想(或不能)在應用程序中使用Boost,下面應該讓你的號碼(從How to find the number of parameters to a Python function from C?容易適應):

PyObject *key, *value; 
int pos = 0; 
while(PyDict_Next(methodsDictionary, &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); 
     } 
    } 
} 

如果您在Python是2.X的以上絕對有效。在Python 3.0+中,您似乎需要在上面的代碼片段中使用"__code__"而不是"func_code"

我很欣賞無法使用Boost(我的公司不會允許它用於最近開展的項目),但總的來說,如果可以的話,我會嘗試關閉並使用它,因爲我已經發現,當你嘗試做這樣複雜的事情時,Python C API通常會變得有點煩瑣。

相關問題