1
我們可以提取的PyObject使用找出一個方法的PyObject多少個參數需要
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());
我想知道的方法有多少參數需要指向一個python方法。所以如果功能是
def f(x,y):
return x+y
我如何知道它需要2個參數?
我們可以提取的PyObject使用找出一個方法的PyObject多少個參數需要
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());
我想知道的方法有多少參數需要指向一個python方法。所以如果功能是
def f(x,y):
return x+y
我如何知道它需要2個參數?
通過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通常會變得有點煩瑣。
潛在的相關性:http://stackoverflow.com/questions/6616398/finding-python-function-parameters-from-c –
此外,只注意到'.c_str()'在那裏 - 所以我猜你'使用C++。你看過Boost.Python或其他包裝庫嗎? - 使用本地Python C-API不是最愉快的體驗 –