を使用して、Python メソッドを指す PyObject を抽出できます。
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());
メソッドが受け取る引数の数を知りたいです。したがって、関数が
def f(x,y):
return x+y
2 つの引数が必要かどうかを調べるにはどうすればよいですか?
を使用して、Python メソッドを指す PyObject を抽出できます。
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());
メソッドが受け取る引数の数を知りたいです。したがって、関数が
def f(x,y):
return x+y
2 つの引数が必要かどうかを調べるにはどうすればよいですか?
ジョンが提供するリンクをたどります。アプリケーションでBoostを使用したくない(または使用できない)と仮定すると、次のようにして数を取得する必要があります(CからPython関数へのパラメーターの数を見つける方法から簡単に適応できますか?):
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 は、このような複雑なことをしようとすると、一般的に少し扱いにくくなる可能性があります。