2012-11-21 2 views
1

우리는의 PyObject 나는 방법이 걸리는 얼마나 많은 인수를 알고 싶어PyObject 일 방법

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

사용하여 파이썬 방법을 가리키는 추출 할 필요가 얼마나 많은 인수를 알아내는. 따라서 함수가

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이나 다른 wrapper 라이브러리를 보았습니까? - 네이티브 Python C-API 사용은 가장 즐거운 경험이 아닙니다. –

답변

0

Jon이 제공 한 링크가 이어집니다. 당신이 원하지 않는 (또는 수 없습니다) 응용 프로그램에서 부스트를 사용하는 가정하면, 당신에게 (쉽게 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); 
     } 
    } 
} 

가 2.x으로 확실히 위에 작동합니다. Python 3.0 이상에서는 위의 코드 조각에 "func_code" 대신 "__code__"을 사용해야합니다.

Boost (내 회사에서는 최근에 작업 한 프로젝트에서 허용하지 않음)를 사용할 수 없으므로 감사합니다.하지만 일반적으로 나는 가능한 한 내려고 사용하려고합니다. 파이썬 C API가 이와 같은 복잡한 일을하려고 할 때 일반적으로 조금 비웃을 수 있다는 것을 알았습니다.