5

Python C API で という名前のPyEval_CallFunction便利な関数を発見しました。次のように言うことで、Python callable を呼び出すことができます。

PyEval_CallFunction(obj, "OOO", a, b, c);

ただし、この関数に関する公式ドキュメントは見つかりません。Google 検索では、この機能について説明しているさまざまな非公式のチュートリアルが表示されますが、次のようになります。

  1. この関数公式の Python ドキュメントに記載されていないため、パブリック API の一部であると想定されているものであるかどうかはわかりません。

  2. Web を検索すると、一貫性のない使用ポリシーが見つかります。一部のチュートリアルでは、フォーマット文字列が型リストの周りに括弧が必要であることを示していますが "(OiiO)"、他の場合は括弧なしで使用されています。実際のプログラムで実際に関数を試してみると、括弧が必要なようです。そうしないと、segfault が発生します。

この機能は便利なので使ってみたいです。誰かがこれについて何か知っていますか、または文書化されていない理由を知っていますか? それはパブリック API の一部ですか?

4

2 に答える 2

5

私もそれへの参照を多く見つけることができませんでしたが、あなたがリンクしたチュートリアルはこれについて言及しています:

文字列形式と次の引数は Py_BuildValue と同じです (XXX なので、今までに説明しておくべきでした!)。のような呼び出し

PyEval_CallFunction(obj, "iii", a, b, c);

と同等です

PyEval_CallObject(obj, Py_BuildValue("iii", a, b, c));

PyEval_CallFunctionその値はかなり制限されているように見えるため、パブリック API ではないと思います。この 2 つに大きな違いはありません。しかし、繰り返しになりますが、私は Python 拡張機能にはあまり関与していないので、これは単なる私の見解です。

PyEval_CallObjectそれ自体は単なるマクロPyEval_CallObjectWithKeywordsです。

#define PyEval_CallObject(func,arg) \
        PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)

「パブリックAPIとは?」の件について Martin v. Löwis からの最近のメッセージは次のとおりです。

Georg の説明を強調してサポートするために、API はドキュメントではなく、主にヘッダー ファイルで定義されています。PyAPI_FUNC として宣言され、_Py で始まらないすべての関数はパブリック API です。ドキュメント化されていない API がたくさんありました (1.4 までは、API ドキュメントはまったくなく、拡張モジュールのチュートリアルのみでした)。最近では、ますます多くの API が文書化されています。

http://mail.python.org/pipermail/python-dev/2011-February/107973.html

于 2011-02-07T14:51:20.297 に答える
5

文書化されていない理由は、代わりにPyObject_CallFunctionを使用する必要があるためです。

関数ファミリは、インタプリタ評価ループのPyEval_*生の内部呼び出しです。対応する文書化されPyObject_*た呼び出しには、すべての追加のインタープリター状態の整合性チェック、引数の検証、およびスタック保護が含まれています。

于 2011-02-08T04:26:48.257 に答える