PyObject *がPythonオブジェクトを指している場合、オブジェクトメソッドの1つを呼び出すにはどうすればよいですか?これはPython C API documentation上に読むオブジェクトのメソッドの呼び出し
>>> ret = obj.foo("An arg")
PyObject *がPythonオブジェクトを指している場合、オブジェクトメソッドの1つを呼び出すにはどうすればよいですか?これはPython C API documentation上に読むオブジェクトのメソッドの呼び出し
>>> ret = obj.foo("An arg")
PyObject* obj = ....
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
if (!ret) {
// check error...
}
の同等だろう
PyObject* obj = ....
PyObject* args = Py_BuildValue("(s)", "An arg");
PyObject* method = PyWHATGOESHERE(obj, "foo");
PyObject* ret = PyWHATGOESHERE(obj, method, args);
if (!ret) {
// check error...
}
:ドキュメントには、この例を示しますことはありません。この場合、object protocolが必要です。
PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
戻り値:新たな参照。
可変数のC 引数を持つオブジェクトoのメソッドという名前のメソッドを呼び出します。 Cの引数は
Py_BuildValue()
フォーマット タプルを生成すべき文字列で記述されています。 形式はNULL
であり、引数が指定されていない を示します。 成功またはNULL
失敗時にコールの結果を返します。これは、Python の式o.method(args)
に相当する です。 は、PyObject * args
、PyObject_CallMethodObjArgs()
の場合は の方が早いでしょう。
そして
PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)
戻り値:新たな参照。
オブジェクト名
o
のメソッドを呼び出します。メソッド名には、 という名前のPython文字列オブジェクトが渡されます。可変数のPyObject*
引数を使用して が呼び出されます。引き数は で、可変数は で、その後にはNULL
が続きます。成功した場合は 、失敗した場合はNULL
を返します。
あなたの例では、次のようになります。
PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
私はその7年が遅すぎることは知っていますが、フォーマット引数ではどういう意味ですか? – JMzance
これはPy_BuildValueと同じ書式文字列です。括弧はタプルを作成することを意味し、sは次の引数( "arg")がPython文字列に変換されるC char *文字列になることを意味します。タプルは関数の位置引数として使用されるので、1つの文字列を渡しています。 –
'' '' kks '、' sss '、' www '、' sse '] 'や' [323.9,32,443,324]のような文字列や二重引用符のリストとしてc配列を渡したいのであれば、 '434.8,56.6]'? – jaykumarark
「オブジェクト・プロトコル」は問題だったが何であるかを知ります。また、私は何らかの理由で呼び出しを探していました。ありがとう。 – jmucchiello